我有一个继承自int的类,在我的类init函数中,我没有调用父init功能,但当我使用parent(int(方法时,不知何故仍然有一个值,这意味着我认为父 init例如: 将返回8 我认为父构造函数可能是隐式调用的,但在这段代码中我看到它不是: 将返回:在子初始化中class NumberWithCall(int):
def __init__(self, number):
pass
print(NumberWithCall(8))
class parent:
def __init__(self):
print("in parent init")
class son(parent):
def __init__(self):
print("in son init")
son()
我打算向您展示大致情况。顺便说一下,我过度简化了这个。
首先考虑在类中实现__call__
。它使类的实例能够被调用。
现在我们知道类本身就是实例->类型为type
:
class A:
pass
print(isinstance(A, type)) # True
因此,必须存在CCD_ 3方法;他们的";类(更好地说元类(,当然在type
中有一个。
当你把括号放在类前面时,你实际上是在用给定的参数(这里是8
(调用这个方法。它的作用是,首先(这里发生了其他一些事情,但我们忽略了(用您传递给__call__
的参数调用__new__
方法,该方法返回int
的实例,然后__init__
将作为新创建的int对象的实例方法被调用。
所以你的课的工作方式是因为这个:
class NumberWithCall(int):
def __new__(cls, number):
created_object = super().__new__(cls, number)
return created_object
def __init__(self, number):
print(f'init is called with number={number}')
print(NumberWithCall(8))
您从int
继承了这个__new__
,所以是的,正如@johnrsharpe在评论中指出的那样,"Python中的不可变类型通常在__new__
中工作,而不是在__init__
中工作