美文网首页
__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