我目前正在 edube.org 上的 3.2.1.10 A short travel from procedural to object approachlab,課程(Python Essentials 2(中級,v.2.0))。
該任務是關于以面向物件的風格對堆疊進行編程。到目前為止,我們有一個 push 和 pop 方法,還有一個簡單的堆疊,我們可以填充和洗掉最后一個專案。現在應該擴展為能夠顯示堆疊中的值的總和。實驗室給出的完整代碼如下:
class Stack:
def __init__(self):
self.__stack_list = []
def push(self, val):
self.__stack_list.append(val)
def pop(self):
val = self.__stack_list[-1]
del self.__stack_list[-1]
return val
class AddingStack(Stack):
def __init__(self):
Stack.__init__(self)
self.__sum = 0
def get_sum(self):
return self.__sum
def push(self, val):
self.__sum = val
Stack.push(self, val)
def pop(self):
val = Stack.pop(self)
self.__sum -= val
return val
stack_object = AddingStack()
for i in range(5):
stack_object.push(i)
print(stack_object.get_sum())
for i in range(5):
print(stack_object.pop())
該代碼有效。作為使用class AddingStack(Stack)它的解釋說:
我們不想修改之前定義的堆疊。它的應用程式已經足夠好,我們不希望它有任何改變。我們想要一個具有新功能的新堆疊。換句話說,我們想要構造一個已經存在的 Stack 類的子類。
第一步很簡單:只需定義一個新的子類,指向將用作超類的類。
這是它的樣子: classAddingStack(Stack): pass
該類尚未定義任何新組件,但這并不意味著它是空的。它獲取其超類定義的所有組件
但是,當我運行相同的代碼時,只需將該行修改為:
class AddingStack():
它仍然有效。我不明白這樣做的好處class AddingStack(Stack)是什么?
uj5u.com熱心網友回復:
通常從效益繼承在OOP是從現有類的能力,箱類,并修改它有點輕松。
如果你真的只是覆寫超類中的每個函式,那么不,不要使用繼承,它不會給你帶來任何好處。
當你有一個它的情況下非常有用的子類,只有改變一些功能,并從東西超一流的,剩下的,將使用超一流的功能。
uj5u.com熱心網友回復:
但是,當我運行相同的代碼時,只需將該行修改為:
class AddingStack():它仍然有效。我不明白上課的好處
AddingStack(Stack)是什么?
它仍然有效,因為在這些方法中AddingStack顯式呼叫其他方法Stack。
您實際上并沒有使用任何繼承的方法,這會破壞繼承的全部意義。
uj5u.com熱心網友回復:
它之所以有效,是因為您在計算總和時并未實際使用堆疊中的元素,而是將結果累加到__sum變數中。
您也沒有使用繼承,而是委托給 class的pop()和push()方法Stack。
該練習的目標似乎是讓您將堆疊的元素(已在超類中實作)相加,并實作get_sum()這樣您遍歷堆疊上的值串列并將它們相加。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314646.html
上一篇:多型和with陳述句
下一篇:在基類方法中參考繼承類?
