簡體   English   中英

Python:如何通過派生類實例訪問父類對象?

[英]Python: How to access parent class object through derived class instance?

對不起我的愚蠢問題,但是......我想我有這些課:

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必須是類型,而不是classobj”。

你其實想要使用

class A(object):
    ...
...
b = B()
bar = super(b.__class__, b)
print bar.msg

基類必須是新式類(從object繼承)

如果該類是單繼承的:

foo = B()
print foo.__class__.__bases__[0].msg
# 'hehehe'

如果該類是多重繼承的,那么這個問題沒有意義,因為可能有多個類定義了'msg',它們都可能是有意義的。 你最好提供實際的父母(即A.msg )。 或者,您可以按照@Felix的答案中所述迭代所有直接基礎。

不知道你為什么要這樣做

>>> class A(object):
...     msg = 'hehehe'
... 
>>> class B(A):
...     msg = 'hohoho'
... 
>>> foo=B()
>>> foo.__class__.__mro__[1].msg
'hehehe'
>>> 

試試:

class A(object):
    msg = 'hehehe'

編輯:

對於'msg'屬性,您需要:

foo = B()
bar = super(foo.__class__, foo)
print bar.msg

由於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')
#for B() you can use __bases__
print foo.__class__.__bases__[0].msg

但是當有多個基類和/或層次結構的深度不是一個時,這並不容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM