对不起我的愚蠢问题,但是......让我们假设我有这些课程:
class A():
msg = 'hehehe'
class B(A):
msg = 'hohoho'
class C(B):
pass
和B或C的实例。如何通过此实例从父类的对象中获取变量'msg'? 我试过这个:
foo = B()
print super(foo.__class__).msg
但收到消息:“TypeError:super()参数1必须是type,而不是classobj”。
答案 0 :(得分:15)
您实际上想要使用
class A(object):
...
...
b = B()
bar = super(b.__class__, b)
print bar.msg
基类必须是新式类(继承自object
)
答案 1 :(得分:8)
如果该类是单继承的:
foo = B()
print foo.__class__.__bases__[0].msg
# 'hehehe'
如果该类是多重继承的,那么这个问题没有意义,因为可能有多个类定义了'msg',它们都可能有意义。您最好提供实际的父级(即A.msg
)。或者,您可以按@Felix的答案中所述迭代所有直接基数。
答案 2 :(得分:2)
不确定为什么要这样做
>>> class A(object):
... msg = 'hehehe'
...
>>> class B(A):
... msg = 'hohoho'
...
>>> foo=B()
>>> foo.__class__.__mro__[1].msg
'hehehe'
>>>
答案 3 :(得分:1)
尝试:
class A(object):
msg = 'hehehe'
编辑:
对于'msg'属性,您需要:
foo = B()
bar = super(foo.__class__, foo)
print bar.msg
答案 4 :(得分:1)
由于msg
是一个类变量,你可以这样做:
print C.msg # prints hohoho
如果覆盖变量(就像在类B
中那样),则必须找到正确的父类。请记住,Python支持多重继承。
但是当你定义类时,你现在B
继承自A
,你总是可以这样做:
class B(A):
msg = 'hohoho'
def get_parent_message(self):
return A.msg
<强>更新强>
最可靠的是:
def get_parent_attribute(instance, attribute):
for parent in instance.__class__.__bases__:
if attribute in parent.__dict__:
return parent.__dict__[attribute]
然后:
foo = B()
print get_parent_attribute(foo, 'msg')
答案 5 :(得分:0)
#for B() you can use __bases__
print foo.__class__.__bases__[0].msg
但是当有多个基类和/或层次结构的深度不是一个时,这并不容易。