例如,类声明:
class Something(Superclass):
an_attribute = 1
another_attribute = 'hello'
python有没有办法告诉我在这个类声明中定义了an_attribute
和another_attribute
?
我想,构建这个问题的另一种方法是“我可以通过声明它们的类来过滤dir
个结果吗?
答案 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)并查看是否引发异常来实现的。)