我通过尝试学习继承开始了我的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.m2
与A.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 时的样子
我将尝试按顺序回答您的问题:
-
如果你要说
a = A(1)
,__init__
会将变量self._x设置为2
。这不会改变,因为您永远不会编辑在此之后self._x
变量。- 函数
m1
和m2
可以根据传入x
返回任何内容。你是说self._x
吗?是的,当您调用m1
时,m2
会执行,m1
对于任何数字x
只会返回x + 1
。
- 函数
-
a = A(1)
只是实例化类A
,这些方法只能使用A(x).m1(y)
,而如果你包含a = A(1)
,你将执行a.m1(y)
。 -
用任何数字(
B(x)
)实例化类B
运行A
(super().init(args)
)的__init__()
函数,并传递x
(尝试自己运行它,比如b = B(2); print(b._x)
!因此,self._x
你通过B是2 * x
! -
您已经覆盖了类
B
中的方法m2()
,因此B
中不使用A
中的m2()
。
如果您有任何其他问题,请发表评论,我会尝试回答!