检查变量是否属于 python 中的 class
Checking if a variable belongs to a class in python
我有一个小的class如下:
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,其中包含美国的所有州,如下所示:
class States(object):
ALABAMA = 'AL'
ALASKA = 'AK'
ARIZONA = 'AZ'
ARKANSAS = 'AR'
CALIFORNIA = 'CA'
COLORADO = 'CO'
CONNECTICUT = 'CT'
DELAWARE = 'DE'
DISTRICTOFCOLUMBIA = 'DC'
....
....
就像上面的例子,我的参数现在是AL。但是,由于美国有50个州,我实际上不能像我使用的那样使用具有50个变量的元组above.Is 有更好的方法吗?我确实阅读了有关 isinstance 的内容,但它没有给我预期的结果。
你为什么不用字典?它更简单,查找也会更容易。
states = {'AL': 'Alabama', 'AK': 'Alaska' ... }
test_state = 'Foo'
if test_state not in states.keys():
print('{} is not valid input'.format(test_state))
你可以使用 __dict__
属性 组成一个 class,例如:
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
正如 Peter Wood 指出的那样,vars()
内置函数也可用于检索 __dict__
:
In [12]: "b" in vars(Foo).values()
Out[12]: True
__dict__
属性 也用作 namespace for classes and so will return all methods, magic methods 和 class 上的私有属性,因此为了稳健性,您可能需要稍微修改搜索以补偿。
在您的情况下,您可能希望使用 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 问题,但读者可能也对 Python 3 中的 Enum
库感兴趣,它很可能是一个更好的数据容器。
我建议使用 Enum 来定义 Gender
和 States
。
Enum if part of the standard library on Python 3
. If you are on Python 2
use enum34,使用 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)
确实,如果您可以在开始时设置所有参数,那么最好只放置所需的参数而不使用默认参数。这会强制用户设置参数。但是,由于各种原因,您通常可能希望稍后再设置这些属性。
我发现定义一个 class 要求非常方便,我可以将其用作占位符,并在对象“发送到生产”之前使用函数 validate
。
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()
我有一个小的class如下:
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,其中包含美国的所有州,如下所示:
class States(object):
ALABAMA = 'AL'
ALASKA = 'AK'
ARIZONA = 'AZ'
ARKANSAS = 'AR'
CALIFORNIA = 'CA'
COLORADO = 'CO'
CONNECTICUT = 'CT'
DELAWARE = 'DE'
DISTRICTOFCOLUMBIA = 'DC'
....
....
就像上面的例子,我的参数现在是AL。但是,由于美国有50个州,我实际上不能像我使用的那样使用具有50个变量的元组above.Is 有更好的方法吗?我确实阅读了有关 isinstance 的内容,但它没有给我预期的结果。
你为什么不用字典?它更简单,查找也会更容易。
states = {'AL': 'Alabama', 'AK': 'Alaska' ... }
test_state = 'Foo'
if test_state not in states.keys():
print('{} is not valid input'.format(test_state))
你可以使用 __dict__
属性 组成一个 class,例如:
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
正如 Peter Wood 指出的那样,vars()
内置函数也可用于检索 __dict__
:
In [12]: "b" in vars(Foo).values()
Out[12]: True
__dict__
属性 也用作 namespace for classes and so will return all methods, magic methods 和 class 上的私有属性,因此为了稳健性,您可能需要稍微修改搜索以补偿。
在您的情况下,您可能希望使用 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 问题,但读者可能也对 Python 3 中的 Enum
库感兴趣,它很可能是一个更好的数据容器。
我建议使用 Enum 来定义 Gender
和 States
。
Enum if part of the standard library on Python 3
. If you are on Python 2
use enum34,使用 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)
确实,如果您可以在开始时设置所有参数,那么最好只放置所需的参数而不使用默认参数。这会强制用户设置参数。但是,由于各种原因,您通常可能希望稍后再设置这些属性。
我发现定义一个 class 要求非常方便,我可以将其用作占位符,并在对象“发送到生产”之前使用函数 validate
。
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()