1
类
的实例时__new__
返回类的实例,一切都很好,我们没有任何问题创建子类:继承时__new __()不返回
class A:
def __new__(cls, p1, p2):
self = object.__new__(cls)
return self
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2
class B(A):
def __new__(cls, p3):
self = super().__new__(cls, 1, 2)
return self
def __init__(self, p3):
super().__init__(1, 2)
self.p3 = p3
a = A(1, 2)
print(a.p2) # output: 2
b = B(3)
print(b.p3) # output: 3
但是,
如果
__new__()
不会返回cls
的实例,那么将不会调用新的 实例的__init__()
方法。
看起来我们必须调用__init__()
内__new__()
直接,但是这会导致错误,当我们在子类中调用super().__new__
:
class A:
def __new__(cls, p1, p2):
self = object.__new__(cls)
self.__init__(p1, p2) # we should call __init__ directly
return [self] # return not instance
def __init__(self, p1, p2):
self.p1 = p1
self.p2 = p2
class B(A):
def __new__(cls, p3):
self = super().__new__(cls, 1, 2)
return self
def __init__(self, p3):
self.p3 = p3
a = A(1, 2)
print(a[0].p2) # output: 2
b = B(3) # TypeError: __init__() takes 2 positional arguments but 3 were given
print(b[0].p3)
如何解决呢?如果A.__new__()
没有返回类的实例,如何创建A
的子类?