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

标签 python class instance

我有一个小类,如下所示:

class Gender(object):
    MALE = 'M'
    FEMALE = 'F'

我有一个参数变量,它只能是 MF。为了确保它只是那个,我执行以下操作:

>>> 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/

相关文章:

python - 如何将机器学习算法连接到数据库

c++ - 如何区分 LineSegment 类和 Line 类?

java - 尝试创建一个结构化数组Java

string - 在 Swift 中将字符串从 View Controller 传递到文件

java - 导入包并使用实例变量

C# 从 Form1 中的静态方法获取现有 Form1 实例

java - 使用带有键对象参数的方法修改类实例字段

python - Altair 中的重复图

python - 我怎样才能提高这个最短路径/捷径(数组图DS)解决方案的速度?

python - Python 中的第一次绘制时间(可能使用或不使用 Selenium)?