以下代码在调用multiply
方法调用派生的multiply
方法后打印30
:
class A:
def __init__(self):
self.multiply(15)
print(self.i)
def multiply(self, i):
self.i = 4 * i
class B(A):
def __init__(self):
super().__init__()
def multiply(self, i):
self.i = 2 * i
obj = B()
首先调用super().__init__()
,然后由于multiply
重写,因此调用派生的multiply
方法。
如果对象甚至没有完全构造好(如果我们在基类的__init__
方法中,那么我们甚至还没有完成基对象的构造,那么我们怎么可以调用派生方法呢(?
__new__
返回后调用__init__
;也就是说,obj = B()
近似等于
obj = B.__new__(B) # create the new object
obj.__init__() # initialize it
通常,类不会覆盖__new__
;它只是延迟到CCD_ 12。(即使它定义了__new__
,也必须确保object.__new__
最终被调用。(