【发布时间】:2012-07-01 21:00:52
【问题描述】:
例如类声明:
class Something(Superclass):
an_attribute = 1
another_attribute = 'hello'
python有什么方法可以告诉我an_attribute和another_attribute是在这个类声明中定义的?
我猜这个问题的另一种表达方式是“我可以按声明它们的类过滤dir 结果吗?
【问题讨论】:
标签: python
例如类声明:
class Something(Superclass):
an_attribute = 1
another_attribute = 'hello'
python有什么方法可以告诉我an_attribute和another_attribute是在这个类声明中定义的?
我猜这个问题的另一种表达方式是“我可以按声明它们的类过滤dir 结果吗?
【问题讨论】:
标签: python
类的属性保存在它的特殊__dict__ 字段中。 __dict__ 仅包含为当前类定义的属性(以及特殊属性)。正如其他人提到的,它可以直接访问,也可以通过内置的vars() 函数访问。
我强烈建议阅读this 文章,该文章解释了 Python 如何深入处理属性。
【讨论】:
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']
【讨论】:
keys(),你可以这样做:print(list(A.__dict__))。
SomeThing 类的属性字典可以通过vars(SomeThing) 访问。另请参阅documentation of vars()。
【讨论】:
>>> 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'}
>>>
【讨论】:
另一种方法是使用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)]
【讨论】:
有内置的hasattr函数
hasattr(object, name)
如果字符串是对象属性之一的名称,则结果为 True,否则为 False。 (这是通过调用 getattr(object, name) 并查看它是否引发异常来实现的。)
【讨论】:
Foo 及其子类Bar,无论属性是在Foo 还是Bar 中定义的,hasattr(Bar, attr) 都将返回true。