检查类属性是否在给定类中定义或派生
示例
class A:
foo = 1
class B:
foo = 2
class C:
foo = 3
class D(A, B, C):
pass
def collect_foo(cls):
import inspect
foos = []
for c in inspect.getmro(cls):
if hasattr(c, 'foo'):
foos.append(c.foo)
return foos
现在,collect_foo(D)
返回的是 [1, 1, 2, 3]
- 这里的 1
出现了两次,因为 D
是从 A
继承过来的。问题是 - 如何得到唯一的 foo
值。首先我想到的是检查某个属性是从哪个类继承的,还是在当前类中声明的 - 这样做可以吗?怎么实现呢?
4 个回答
1
“问题是,有些属性我不想被覆盖,而是希望它们能够混合在一起,并且可以在派生类中使用。”
这正是Python中的命名空间混淆所做的事情。那些不应该被覆盖的属性应该以两个下划线开头。这样,它们就不会被覆盖,同时每个类都有自己独特的属性。
17
只需检查一下
'foo' in c.__dict__
而不是
hasattr(c, 'foo')
这样做只有在属性在 c
本身被定义的情况下,才会返回 True
。
11
我觉得这样做应该没问题……可以看看这个类的 __dict__
属性里有没有。 但是,首先要确保你真的想这么做。
举个例子:
if name in cls.__dict__:
# ... your code here ...
pass