OOP - 了解继承



我通过尝试学习继承开始了我的OOP之旅。我在关于该主题的在线测验中看到此代码,我希望有人可以向我解释它,因为它对我来说毫无意义。

class A(object) :
def __init__(self, x) :
self._x = 2 * x
def m1(self, x) :
return self.m2(x) + 2
def m2(self, x) :
return x - 1

class B(A) :
def m2(self, y) :
self._y = y
return self._x + self._y

对于以下内容,如果我说 a = A(1),预期回报是多少?初始化将 1 乘以 2,因此现在 x 的实例的值为 2。方法 m1 会发生什么?它接收 X 的这个实例,但在返回中它指的是 m2?那么 x=2 是先传递到 m2 中,然后 1 的返回传递给 m1 吗?哪个加了 2?

至于 B 类,我看到它改变了从 A 类继承的 m2 方法,但是添加到 y 中的 x 值,这是从 A 类继承的 x 值吗?

很抱歉无休止的问题,但我才刚刚开始,似乎很难绕开我的头。

弄清楚代码的作用的最简单方法是运行它。

>>> a = A(1)
>>> a.m1(10)
11

这里要注意的一件重要事情(从您的问题听起来您可能会感到困惑)是您传递给A.__init__x的值不会被A.m1使用!因此,无论您如何初始化A实例,A.m1(x)都会返回x + 1

>>> a = A(1000)
>>> a.m1(1)
2
>>> a.m1(10)
11
>>> a.m1(100)
101

好吧,如果我们以同样的方式制作B呢?

>>> b = B(1)
>>> b.m1(10)
14

现在不一样了,因为B.m2A.m2不同. 我们可以自己运行它们以查看:

>>> a.m2(10)
9
>>> b.m2(10)
12

a.m2(10)是 9,因为无论a._x是什么a.m2(x)总是x - 1

但是b.m2(10)返回b._x + 10,在本例中是12 - 所以b.m1(10)返回加2。 如果我们通过使用不同的值初始化我们的B来更改b._x是什么,结果会有所不同:

>>> b = B(2)
>>> b.m2(10)
14
>>> b.m1(10)
16

您始终可以跟踪发生的情况:

...
class B(A) :
def m2(self, y) :
self._y = y
return self._x + self._y

然后,class B看起来像Bx,因为m2被覆盖:


class Bx:
def __init__(self, x) :
self._x = 2 * x
def m1(self, x) :
return self.m2(x) + 2
def m2(self, y) :
self._y = y
return self._x + self._y

所以这就是class B继承 A 时的样子

我将尝试按顺序回答您的问题:

  1. 如果你要说a = A(1)__init__会将变量self._x设置为2这不会改变,因为您永远不会编辑在此之后self._x变量。

    • 函数m1m2可以根据传入x返回任何内容。你是说self._x吗?是的,当您调用m1时,m2会执行,m1对于任何数字x只会返回x + 1
  2. a = A(1)只是实例化类A,这些方法只能使用A(x).m1(y),而如果你包含a = A(1),你将执行a.m1(y)

  3. 用任何数字(B(x))实例化类B运行A(super().init(args))的__init__()函数,并传递x(尝试自己运行它,比如b = B(2); print(b._x)!因此,self._x你通过B是2 * x

  4. 您已经覆盖了类B中的方法m2(),因此B中不使用A中的m2()

如果您有任何其他问题,请发表评论,我会尝试回答!

最新更新