Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查变量是否属于python中的类_Python_Class_Instance - Fatal编程技术网

检查变量是否属于python中的类

检查变量是否属于python中的类,python,class,instance,Python,Class,Instance,我有一个小班,如下所示: class Gender(object): MALE = 'M' FEMALE = 'F' 我有一个参数变量,它只能是M或F >>> parameter = 'M' >>> if parameter not in (Gender.MALE, Gender.FEMALE) ... print "Invalid parameter" ... Invalid parameter >>> 现在我有

我有一个小班,如下所示:

class Gender(object):
    MALE = 'M'
    FEMALE = 'F'
我有一个参数变量,它只能是MF

>>> parameter = 'M'
>>> if parameter not in (Gender.MALE, Gender.FEMALE)
...     print "Invalid parameter"
...
Invalid parameter
>>>
现在我有一个包含美国所有州的类,如下所示:

class States(object):
    ALABAMA = 'AL'
    ALASKA = 'AK'
    ARIZONA = 'AZ'
    ARKANSAS = 'AR'
    CALIFORNIA = 'CA'
    COLORADO = 'CO'
    CONNECTICUT = 'CT'
    DELAWARE = 'DE'
    DISTRICTOFCOLUMBIA = 'DC'
    ....
....

像上面的例子一样,我的参数现在是AL。但是,由于美国有50个州,我实际上无法像上面那样使用包含50个变量的元组。有更好的方法吗?我确实读过有关iInstance的文章,但它没有给我预期的结果。

你为什么不使用字典呢?它简单得多,查找也会更容易

states = {'AL': 'Alabama', 'AK': 'Alaska' ... }
test_state = 'Foo'

if test_state not in states.keys():
    print('{} is not valid input'.format(test_state))

您可以使用组成类的
\uuuu dict\uuu
属性,例如:

In [1]: class Foo(object):
   ...:     bar = "b"
   ...:     zulu = "z"
   ...:     
In [2]: "bar"  in Foo.__dict__
Out[2]: True
或者在搜索值时使用
\u dict\u.values()

正如Peter Wood指出的那样,内置函数还可用于检索
\uuu dict\uuu

In [12]: "b" in vars(Foo).values()
Out[12]: True

\uuuuu dict\uuuu
属性用作,因此将返回类上的所有方法和私有属性,因此为了保持健壮性,您可能需要稍微修改搜索以进行补偿

在您的情况下,可能需要使用
类方法
,例如:

class States(object):
    ALABAMA = "AL"
    FLORIDA = "FL"

    @classmethod
    def is_state(cls, to_find):
        print(vars(cls))
        states = [val for key, val in vars(cls).items()
                  if not key.startswith("__")
                  and isinstance(val, str)]
        return to_find in states

States.is_state("AL") # True
States.is_state("FL") # True
States.is_state("is_state") # False
States.is_state("__module__") # False

更新
这清楚地回答了OPs的问题,但读者可能也对Python 3中的库感兴趣,它很可能是这样的数据的更好容器。

我建议使用Enum来定义
性别和
状态
如果是Python 3上标准库的一部分
。如果您使用的是
python2
use,请使用
pip install enum34
安装

from enum import Enum
class States(Enum):
    ALABAMA = 'AL'
    ALASKA = 'AK'
    ARIZONA = 'AZ'
    ARKANSAS = 'AR'
    CALIFORNIA = 'CA'
    COLORADO = 'CO'
    CONNECTICUT = 'CT'
    DELAWARE = 'DE'
    DISTRICTOFCOLUMBIA = 'DC'
    ...
然后,您可以通过以下方式检查变量是否为状态之一:

isinstance(variable, States)

事实上,如果您可以在开始时设置所有参数,那么最好只设置所需的参数而不设置默认参数。这将强制用户设置参数。但是,由于各种原因,您通常可能希望稍后设置属性

我发现定义一个我可以用作占位符的类非常方便,并且在对象“被发送到生产”之前使用函数
validate


如果您使用的是Python 3,请看一下您应该使用一个和IIRC,应该有Python 2的枚举方法。@AndreaCorbellini我肯定有很多枚举方法。好了:您甚至不需要使用
.keys()
,因为
中的
无论如何都会检查这些键
如果test\u state不在states:
。你是对的-我只是有使用
.keys()
的习惯。如果你使用
dict
构造函数,你可以使用关键字参数而不是创建字符串。e、 g.
dict(AL='Alabama',AK='Alaska')
@Burhan..states类已经被定义用于其他目的..如果我以不同的格式重新创建相同的内容,这将是我的重复。。因此,我专门在类中查找访问静态变量的信息。请小心,如果存在与键匹配的方法,这将返回误报。我的类中没有方法,因此这应该足够了。感谢您注意,这不适用于
\uuu slots\uuuu
,更好的方法是使用
hasattr
,但它不同于在类词典中查找,因为它会在继承树中的任何地方查找。您可以使用
vars(Foo)
@AshwiniChaudhary
hasattr()
访问
\uu dict\uuu
,如果OP要求查找
bar
,那就太好了,但他正在尝试查找
“b”
isinstance(variable, States)
class Required(object):
    def __init__(self,description=None):
        self.description = description
    def __repr__(self): 
        return 'Required attribute:%s' %self.description



class MyClass(object):
    def __init__(self):
        self.ID = Required(self.ID = Required("ID is mandatory, please set it using set_ID method."))
        self.context = None
        self.type = "MyClass"


    def set_ID(self,MyClass_ID):
        """
        The id property identifies this MyClass with the URL at which it is available online.
        """
        # check MyClass_ID is valid before assigning it
        # valid(ID)
        self.ID = MyClass_ID

    def validate(self):
        for i in self.__dict__.values():
            if isinstance(i, Required):
                print(i)
                # Warining or raise error

g = MyClass()
g.validate()