python可以告诉我在当前块中定义了哪个类的属性?

时间:2012-07-01 21:00:52

标签: python

例如,类声明:

class Something(Superclass):
    an_attribute = 1
    another_attribute = 'hello'

python有没有办法告诉我在这个类声明中定义了an_attributeanother_attribute

我想,构建这个问题的另一种方法是“我可以通过声明它们的类来过滤dir个结果吗?

6 个答案:

答案 0 :(得分:4)

类的属性保存在特殊的__dict__字段中。 __dict__仅包含为当前类定义的属性(以及特殊属性)。正如其他人所提到的,可以直接访问它,也可以通过内置的vars()函数访问它。

我强烈建议阅读this文章,该文章解释了Python如何深入处理属性。

答案 1 :(得分:3)

Python 2.7

class A:
    var1 = 2
    va2 = 2
class B(A):
    var3 = 3
    var4 = 4

print(A.__dict__.keys()) #prints ['va2', '__module__', 'var1', '__doc__']
print(B.__dict__.keys()) #prints ['var4', '__module__', '__doc__', 'var3']

Python 3:

print(list(A.__dict__)) #prints ['__module__', 'var1', '__dict__', 'va2', '__weakref__', '__doc__']
print(list(B.__dict__)) #prints ['var4', '__module__', '__doc__', 'var3']

答案 2 :(得分:2)

SomeThing可以访问类vars(SomeThing)的属性字典。另请参阅documentation of vars()

答案 3 :(得分:1)

>>> class Something(list):
...     an_attribute = 1
...     another_attribute = 'hello'
... 
>>> print vars(Something) == Something.__dict__
True
>>> 
>>> print vars(Something)
{'__module__': '__main__', '__doc__': None, 'an_attribute': 1, '__dict__': <attribute '__dict__' of 'Something' objects>, '__weakref__': <attribute '__weakref__' of 'Something' objects>, 'another_attribute': 'hello'}
>>> 

答案 4 :(得分:0)

另一种方法是使用introspection,使用@AshwiniChaudhary的示例:

import inspect

class A:
    var1 = 2
    var2 = 2

class B(A):
    var3 = 3
    var4 = 4

[member for member in inspect.getmembers(B) if member not in inspect.getmembers(A)]
#prints [('var3', 3), ('var4', 4)]

使用这种方法,您可以决定继承层次结构中哪个类要“减去”成员,例如:

class One:
    #members

class Two:
    #members

...

class N:
    #members

[member for member in inspect.getmembers(N) if member not in inspect.getmembers(NMinusK)]

答案 5 :(得分:-2)

内置 hasattr 功能

hasattr(object, name)

如果字符串是对象属性之一的名称,则结果为True,否则返回False。 (这是通过调用 getattr(object,name)并查看是否引发异常来实现的。)