检查变量是否属于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'
我有一个参数变量,它只能是M或F
>>> 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)
@AshwiniChaudharyhasattr()
访问\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()