Python:始终使用__new__代替__init__?
-
01-10-2019 - |
题
我了解两者如何 __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__
除非您是不变的类型。