背景:在学习单例的几种实现方式的时候,用到__new__ 、__call__ 。本文对这几个内置函数进行学习分析。
1、__init__ vs __new__:
咱们先来看看python 官网的原文解释:
__new__()
是一个静态方法 (因为是特例所以你不需要显式地声明),它会将所请求实例所属的类作为第一个参数。其余的参数会被传递给对象构造器表达式 (对类的调用)。__new__()
的返回值应为新对象实例 (通常是 cls 的实例)。
在实例 (通过__new__()
) 被创建之后,返回调用者之前调用。其参数与传递给类构造器表达式的参数相同。一个基类如果有__init__()
方法,则其所派生的类如果也有__init__()
方法,就必须显式地调用它以确保实例基类部分的正确初始化;例如:super().__init__([args...])
.
因为对象是由__new__()
和__init__()
协作构造完成的 (由__new__()
创建,并由__init__()
定制),所以__init__()
返回的值只能是None
,否则会在运行时引发TypeError
。
由此可见:
__new__ 是真正创建实例对象的;且不需要手动调用.
而__init__ 则是获取一个实例化的对象
2、__init__ vs __call__
此方法会在实例作为一个函数被“调用”时被调用;如果定义了此方法,则 x(arg1, arg2, ...) 就大致可以被改写为 type(x).call(x, arg1, ...)。
简单的理解就是init 是 获取实例对象;而call是将实例化对象当作一个函数调用
class Call1:
def __init__(self) -> None:
print("__init__")
def __call__(self):
print("__call__")
a=Call1()
a()
网友评论