美文网首页
__init__、__new__、__call__

__init__、__new__、__call__

作者: candice0430 | 来源:发表于2022-07-04 15:46 被阅读0次

背景:在学习单例的几种实现方式的时候,用到__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()

相关文章

网友评论

      本文标题:__init__、__new__、__call__

      本文链接:https://www.haomeiwen.com/subject/warcbrtx.html