【发布时间】:2021-09-24 19:20:36
【问题描述】:
我目前正在学习 edube.org 的 3.2.1.10 A short Journey from procedural to object approachlab,课程(Python Essentials 2 (Intermediate, 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 类的子类。
第一步很简单:只需定义一个新的子类指向 将用作超类的类。
这就是它的样子:类添加堆栈(堆栈): 通过
该类尚未定义任何新组件,但这并不意味着 它是空的。它获取其超类定义的所有组件
但是,当我运行相同的代码时,只需将行修改为:
class AddingStack():
它仍然有效。不明白class AddingStack(Stack)有什么好处?
【问题讨论】:
-
假设您在类
Stack中有一个size方法。通过将AddingStack定义为class AddingStack():,您不能调用stack_object.size()。这将引发AttributeError异常。即使代码完全相同,您也必须在AddingStack中重新定义size。 -
能否请edit 让标题更准确?我在想类似“如果这个类本身工作正常,为什么它需要成为一个子类?”
-
附带说明,我看不到在每次推送/弹出时保持总和的运行记录的好处。 AddStack 可以很容易地让
sum属性按需计算它。
标签: python oop inheritance