从int对象继承



我有一个继承自int的类,在我的类init函数中,我没有调用父init功能,但当我使用parent(int(方法时,不知何故仍然有一个值,这意味着我认为父

init例如:

class NumberWithCall(int):
def __init__(self, number):
pass
print(NumberWithCall(8))

将返回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__中工作

最新更新