我有一个小类,如下所示:
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个变量的元组。有没有更好的这样做的方式?我确实阅读了有关 isinstance 的内容,但它没有给我预期的结果。
最佳答案
你可以使用 __dict__
属性组成一个类,例如:
In [1]: class Foo(object):
...: bar = "b"
...: zulu = "z"
...:
In [2]: "bar" in Foo.__dict__
Out[2]: True
或者在搜索值时使用 __dict__.values()
:
In [3]: "b" in Foo.__dict__.values()
Out[3]: True
正如彼得伍德指出的那样,vars()
内置也可用于检索 __dict__
:
In [12]: "b" in vars(Foo).values()
Out[12]: True
__dict__
属性用作 namespace for classes所以将返回所有方法,magic methods以及类的私有(private)属性,因此为了健壮性,您可能需要稍微修改搜索以进行补偿。
在您的情况下,您可能希望使用 classmethod
,例如:
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
更新
这清楚地回答了 OP 问题,但读者可能也对 Enum
感兴趣。 Python 3 中的库,它很可能是此类数据的更好容器。
关于python - 检查变量是否属于python中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32796536/