例如,类声明:
class Something(Superclass):
an_attribute = 1
another_attribute = 'hello'
python有什么办法可以告诉我an_attribute
并another_attribute
在这个类声明中定义?
我猜想,提出这个问题的另一种方法是“我可以dir
按声明它们的类过滤结果吗?
例如,类声明:
class Something(Superclass):
an_attribute = 1
another_attribute = 'hello'
python有什么办法可以告诉我an_attribute
并another_attribute
在这个类声明中定义?
我猜想,提出这个问题的另一种方法是“我可以dir
按声明它们的类过滤结果吗?
类的属性保存在它的特殊__dict__
字段中。仅包含为当前类定义的__dict__
属性(以及特殊属性)。正如其他人提到的,它可以直接访问,也可以通过内置vars()
函数访问。
我强烈建议阅读这篇文章,它解释了 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']
蟒蛇 3:
print(list(A.__dict__)) #prints ['__module__', 'var1', '__dict__', 'va2', '__weakref__', '__doc__']
print(list(B.__dict__)) #prints ['var4', '__module__', '__doc__', 'var3']
类的属性字典SomeThing
可以通过vars(SomeThing)
. 另请参阅 的文档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'}
>>>
另一种方法是使用自省,使用@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)并查看它是否引发异常来实现的。)