OOP继承概念理解:Python类代码运行逻辑与特性疑问咨询
你给出的代码规范排版如下:
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)时,A的构造方法将入参1乘以2赋值给实例属性_x,最终a._x的取值为2 - 调用A类实例的
m1方法时,你传入的参数会直接赋值给m1的形参x,比如执行a.m1(5)时,m1作用域内的x取值就是5 m1的执行逻辑确实是先将x传入self.m2()得到返回值,再加2作为m1的最终返回结果。以a.m1(5)为例:调用A类自带的m2传入5,返回5-1=4,再加2得到6,就是本次m1调用的返回值。
第二个疑问确认
B类重写的m2方法中用到的_x,就是从父类A继承来的实例属性:
- 由于B没有自定义构造方法
__init__,实例化B时会自动调用父类A的构造方法,必须传入参数完成_x的初始化,比如执行b = B(2)时,b._x的取值为4 - 补充OOP常见考点:如果调用B类实例的
m1方法,因为B没有重写m1,会直接执行从A继承的m1逻辑,但此时self.m2(x)会优先调用B自己重写的m2方法,这就是多态特性的典型体现。比如执行b.m1(3)时:m1拿到的x为3,调用B的m2传入3,返回4+3=7,再加2得到9,就是最终的返回结果。
内容的提问来源于stack exchange,提问作者AgentiDiogenes
相关产品推荐
相关产品推荐

