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

时间:2015-09-26 11:11:46

标签: 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 States(object):
    ALABAMA = 'AL'
    ALASKA = 'AK'
    ARIZONA = 'AZ'
    ARKANSAS = 'AR'
    CALIFORNIA = 'CA'
    COLORADO = 'CO'
    CONNECTICUT = 'CT'
    DELAWARE = 'DE'
    DISTRICTOFCOLUMBIA = 'DC'
    ....
....

与上面的示例一样,我的参数现在是 AL 。但是,由于美国有50个州,我实际上不能使用像上面我使用的50个变量的元组。那里有一个更好的这样做的方式?我确实读过关于isinstance的内容,但它没有给我预期的结果。

4 个答案:

答案 0 :(得分:9)

您可以使用组成类的__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

正如Peter Wood所指出的那样,vars()内置也可用于检索__dict__

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

__dict__属性用作namespace for classes,因此会返回类中的所有方法,magic methods和私有属性,因此为了获得健壮性,您可能需要修改搜索稍微补偿。

在您的情况下,您可能希望使用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库感兴趣,这很可能是这类数据的更好容器。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:5)

我建议使用Enum来定义GenderStates Enum如果Python 3上标准库的一部分。如果您Python 2使用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)

答案 3 :(得分:0)

确实,如果您可以在开头设置所有参数,那么最好只放置所需的参数而无需默认参数。这会强制用户设置参数。但是,您通常可能会出于各种原因稍后再设置这些属性。

我发现定义一个我可以用作占位符的类Required非常方便,并在对象“发送到生产”之前使用函数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()