小编典典

“ __init__”不能做什么,而“ __new__”可以做什么?

python

在Python中,__new__用于初始化不可变类型,__init__通常用于初始化可变类型。如果__init__将其从语言中删除,该怎么办(轻松)?

例如,

class A:

    def __init__(self, *, x, **kwargs):
        super().__init__(**kwargs)
        self.x = x


class B(A):

    def __init__(self, y=2, **kwargs):
        super().__init__(**kwargs)
        self.y = y

可以这样重写__new__

class A_N:

    def __new__(cls, *, x, **kwargs):
        obj = super().__new__(cls, **kwargs)
        obj.x = x
        return obj


class B_N(A_N):

    def __new__(cls, y=2, **kwargs):
        obj = super().__new__(cls, **kwargs)
        obj.y = y
        return obj

为澄清问题的范围:这不是一个问题关于如何__init__以及__new__是使用或它们之间有什么区别。这是一个问题,如果__init__从语言中删除将会发生什么。有什么坏事吗?事情会变得很难或不可能吗?


阅读 154

收藏
2020-12-20

共1个答案

小编典典

您可以在__init__中进行的所有操作都可以在中完成__new__

那么,为什么要使用__init__
因为您不必将实例存储在变量中(obj在示例代码中),以后再麻烦返回它。您可以专注于您真正想做的事情–初始化可变对象。

2020-12-20