2010-02-15 143 views
3

我爲我愚蠢的問題抱歉,但是......假設我有這些類:Python:如何通過派生類實例訪問父類對象?

class A(): 
    msg = 'hehehe' 

class B(A): 
    msg = 'hohoho' 

class C(B): 
    pass 

和B或C的一個實例,我如何從父類中的變量「味精」通過這個實例的對象? 我已經試過這樣:

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

,但得到的消息: 「類型錯誤:超()參數1必須是類型,而不是classobj」。

回答

7

如果類是單繼承:

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

如果類是多重繼承,問題是沒有意義的,因爲可能有多個類定義「味精」,他們都可能是有意義的。您最好提供實際的父代(即A.msg)。或者,您可以遍歷所有直接基礎,如@Felix的答案中所述。

+0

如果該類繼承自多個類,該怎麼辦?你的方法可能在大多數時間都有效,但它不可靠。 –

+0

謝謝。它工作正常 – PyNewbie

+0

@Felix它沒有。 – monokrome

1

嘗試:

class A(object): 
    msg = 'hehehe' 

編輯:

對於 '味精' 屬性,你將需要:

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

不,它不行。他會得到以下錯誤:'AttributeError:'超級'對象沒有屬性'msg''。 –

+0

嗯,我關注的是他提到的錯誤:「TypeError:super()參數1必須是類型的,而不是classobj」,如果他使用從「object」派生的類,它將消失。無論如何,使用這些新的風格類是一個很好的建議!我編輯了我的答案以包含「msg」屬性。 –

1

由於msg是一個類變量,你可以這樣做:

print C.msg # prints hohoho 

如果喲你覆蓋變量(就像你在類B中所做的那樣),你必須找到正確的父類。請記住,Python支持多重繼承

但是當你從A定義類,你現在B繼承你總是可以做到這一點:

class B(A): 
    msg = 'hohoho' 

    def get_parent_message(self): 
     return A.msg 

UPDATE:

最可靠的事情將是:

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') 
+0

是的,我知道。但是如果我不知道給定實例的父類是什麼,我需要準確訪問它的'消息'? – PyNewbie

+0

@PyNewbie:如果你不知道父類,你怎麼知道它有'msg'屬性? –

+0

@PyNewbie:看看我的回答:你做得對,但你忘了使用Python的「新」對象類;你的所有課程都應該繼承「對象」,你會好起來的 –

0
#for B() you can use __bases__ 
print foo.__class__.__bases__[0].msg 

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

2

不知道爲什麼你要做到這一點

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

你真的想使用

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

基類必須是新樣式類(來自object繼承)

+0

就是這樣...我猜 – mshsayem

+0

這個答案的麻煩是基類必須從'object'繼承,它可能不是。如果'super'提供了一種訪問基類本身的方法,並且它的屬性如'__class __.__ bases__'提供,那將會很有用。 – Edward

相關問題