我有下面的類繼承模式:孩子的方法是運行而不是父母的?
object <- A <- B <- Z
現在每個班都會有公共setup()
方法,它調用其他的「私人」的方法_configure()
,其中包含加載代碼,我不想擾亂setup()
。重點是讓每個班級「知道」如何設置自己,並在其他執行之前完成。
所以我想什麼叫Z上的實例安裝的時候是在使用_configure每個設置在其自己的類定義爲運行都 A的設置和B的設定(爲了現在是不是特別重要)。
現在下面的腳本
#!/usr/bin/python
class A(object):
def __init__(self):
self.configured = []
self.set_up = []
def _configure(self):
self.configured.append("A")
def setup(self):
self._configure() # calls B._configure()!
self.set_up.append("A")
class B(A):
def _configure(self):
self.configured.append("B")
def setup(self):
super(B, self).setup()
self._configure()
self.set_up.append("B")
class Z(B):
pass
if __name__ == "__main__":
z = Z()
z.setup()
print "configured: %s" % z.configured
print "set up: %s" % z.set_up
運行B._configure()
兩次,因此返回
[email protected]:~$ ./t.py
configured: ['B', 'B']
set up: ['A', 'B']
[email protected]:~$
,而不是configured: ['A', 'B']...
。
有人可以向我解釋這一點嗎?我應該如何確保A.setup
調用A._configure
?
解決方法:什麼工作了,現在是更換self._configure
與A._configure(self)
,但似乎醜陋和非面向對象:現在每一個可能被潛在的繼承應該重複它的名字與每一個方法調用類? self
的美麗和簡潔在哪裏?
你的輸出說它調用了兩次'B._configure',而不是'A._configure'。 –
這看起來像它的工作方式完全一樣 - 一般來說,子方法被調用,除非你使用'super'。 – Marcin