我了解两者如何 __init____new__ 工作。我想知道是否有什么 __init__ 可以做到 __new__ 不能?

即可以使用 __init__ 被以下模式替换:

class MySubclass(object):
    def __new__(cls, *args, **kwargs):
        self = super(MySubclass, cls).__new__(cls, *args, **kwargs)
        // Do __init__ stuff here
        return self

我在问,因为我想让python oo的这一方面变得更好。

有帮助吗?

解决方案 2

一个可能的答案 Guido的帖子 (谢谢 @fraca7):

例如,在泡菜模块中, __new__ 用于创建不重新化对象时的实例。在这种情况下,创建了实例,但是 __init__ 方法未调用。

还有其他类似的答案吗?


我接受这个答案是我自己的问题的“是”:

我想知道是否有什么 __init__ 可以做到 __new__ 不能?

是的,与众不同 __new__, ,您采取的行动 __init__ 方法将不会在未进行的过程中执行。 __new__ 无法做出这种区别。

其他提示

因此,课堂通常是 type, ,当你打电话 Class()__call__() 方法开 Class的课程处理。我相信 type.__call__() 或多或少地实施:

def __call__(cls, *args, **kwargs):
    # should do the same thing as type.__call__
    obj = cls.__new__(cls, *args, **kwargs)
    if isinstance(obj, cls):
        obj.__init__(*args, **kwargs)
    return obj

您问题的直接答案是否,那就是 __init__() 可以做(更改 /“初始化”指定的实例)是事物的子集 __new__() 可以执行(创建或以其他方式选择其想要的任何对象,在返回对象之前对其想要的对象做任何事情)。

但是,使用两种方法都很方便。指某东西的用途 __init__() 更简单(它不必创建任何东西,不必返回任何东西),我相信最好的做法是始终使用 __init__() 除非您有特定的使用理由 __new__().

好吧,寻找 __new__ vs __init__ 在Google上向我展示了 .

长话短说, __new__ 返回一个新的对象实例, __init__ 什么都没有返回,只是初始化了类成员。

编辑:要真正回答您的问题,您绝对不需要覆盖 __new__ 除非您是不变的类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top