Python 魔法方法 __init__
和 __new__
的区别
简介
在 Python 中,魔法方法是一种特殊方法,它们以双下划线 (__
) 开头和结尾。这些方法负责处理特定任务,例如创建对象、比较对象、获取对象的表示形式等等。
其中两个最常用的魔法方法是 __init__
和 __new__
。这两个方法都与对象创建过程有关,但它们的作用截然不同。
__new__
__new__
是一个类级方法,它负责创建对象。每当使用 new
运算符创建新对象时,都会调用 __new__
方法。
__new__
方法接受类本身和任何传递给 new
运算符的参数作为参数。它返回一个新创建的对象。如果 __new__
方法返回 None
,则不会创建对象,并且会引发 TypeError
异常。
__init__
__init__
是一个实例化方法,它负责初始化新创建的对象。__init__
方法在 __new__
方法之后调用,并且只接受新创建的对象作为参数。
__init__
方法可以用来设置对象属性、执行其他初始化任务,或执行任何其他必要的代码。
区别
__new__
和 __init__
之间的主要区别在于:
__new__
是一个类级方法,而__init__
是一个实例化方法。__new__
负责创建对象,而__init__
负责初始化对象。__new__
接受类本身和new
运算符的参数作为参数,而__init__
仅接受新创建的对象作为参数。
示例
下面的示例演示了 __new__
和 __init__
的使用:
“`python
class MyClass:
def new(cls, args, *kwargs):
print(“new called”)
return super().new(cls, args, *kwargs)
def __init__(self, *args, **kwargs):
print("__init__ called")
self.args = args
self.kwargs = kwargs
my_object = MyClass(1, 2, 3, foo=”bar”)
“`
输出:
__new__ called
__init__ called
用法建议
一般来说,不建议直接重写 __new__
方法。它只应在需要创建自定义对象分配或初始化过程时才重写。
然而,__init__
是用于初始化新创建对象时推荐的方法。它应该用于设置对象属性、执行初始化任务或执行任何其他必要的代码。
常见问答
__new__
和__init__
的调用顺序是什么?__new__
在__init__
之前调用。__new__
和__init__
可以返回什么值?__new__
返回一个新创建的对象,或None
。__init__
没有返回值。我应该在何时重写
__new__
和__init__
方法?
重写__new__
仅在需要自定义对象分配或初始化过程时。重写__init__
用来初始化新创建对象。__new__
和__init__
是否可以同时重写?
是的,可以同时重写__new__
和__init__
方法。如果
__new__
方法返回None
会发生什么?
如果__new__
方法返回None
,则不会创建对象,并且会引发TypeError
异常。
原创文章,作者:冯明梓,如若转载,请注明出处:https://www.wanglitou.cn/article_110147.html