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

Ami*_*tad 11 python class instance

我有一个小班,如下:

class Gender(object):
    MALE = 'M'
    FEMALE = 'F'
Run Code Online (Sandbox Code Playgroud)

我有一个参数变量,只能是MF.为了确保它只是那个,我做以下事情:

>>> parameter = 'M'
>>> if parameter not in (Gender.MALE, Gender.FEMALE)
...     print "Invalid parameter"
...
Invalid parameter
>>>
Run Code Online (Sandbox Code Playgroud)

现在我有一个包含美国所有州的课程如下:

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

就像上面的例子一样,我的参数现在是AL.但是,由于美国有50个状态,我实际上不能使用像我上面使用的50个变量的元组.有更好的方法吗?我确实读过关于isinstance的内容,但它没有给我预期的结果.

Ian*_*ark 10

您可以使用__dict__组成类的属性,例如:

In [1]: class Foo(object):
   ...:     bar = "b"
   ...:     zulu = "z"
   ...:     
In [2]: "bar"  in Foo.__dict__
Out[2]: True
Run Code Online (Sandbox Code Playgroud)

或者当您搜索值时使用__dict__.values():

In [3]: "b" in Foo.__dict__.values()
Out[3]: True
Run Code Online (Sandbox Code Playgroud)

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

In [12]: "b" in vars(Foo).values()
Out[12]: True
Run Code Online (Sandbox Code Playgroud)

__dict__属性用作名称空间,因此将返回类的所有方法,魔术方法和私有属性,因此为了提高健壮性,您可能需要稍微修改搜索以进行补偿.

在您的情况下,您可能希望使用a 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
Run Code Online (Sandbox Code Playgroud)

更新 这个明确的答案是OP的问题,但读者可能也对EnumPython 3 中的库感兴趣,这很可能是这样的数据的更好的容器.

  • @AshwiniChaudhary`hasattr()`如果OP要求找到'bar`会很棒,但他试图找到"b"` (2认同)

Bur*_*lid 6

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

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

if test_state not in states.keys():
    print('{} is not valid input'.format(test_state))
Run Code Online (Sandbox Code Playgroud)


For*_*rge 5

我建议使用Enum来定义GenderStates.
枚举如果是标准库的一部分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'
    ...
Run Code Online (Sandbox Code Playgroud)

然后,您可以检查变量是否是状态之一

isinstance(variable, States)
Run Code Online (Sandbox Code Playgroud)