博客
关于我
python __new__中单例的作用
阅读量:801 次
发布时间:2023-03-06

本文共 1316 字,大约阅读时间需要 4 分钟。

new() 方法的特性

new() 方法是Python中用于实例化类的特殊方法。它在类准备创建实例时被自动调用,并且它是一个静态方法,即使没有显式地使用装饰器也会如此。这一点与普通的类方法不同。

通常情况下,类实例化的流程如下:

class MyClass(object):    def __init__(self, *args, **kwargs):        ...myinstance = MyClass(*args, **kwargs)

在实例化过程中,Python首先会调用当前类的 new() 方法:

def __new__(cls, *args, **kwargs):    ...

其中,cls 表示正在实例化的类。为了确保新实例正确继承自父类,通常需要调用父类的 new() 方法:

def __new__(cls, *args, **kwargs):    return object.__new__(cls)

如果类没有定义 new() 方法,Python会自动调用其父类的 new() 方法,直到追溯到 object 类的 new() 方法。因此,所有新式类(继承自 object)的实例化都会调用 object.new()。

需要注意的是,在重写 new() 方法时,必须谨慎处理父类的 new() 方法。例如:

class Foo(object):    def __new__(cls, *args, **kwargs):        return object.__new__(cls, *args, **kwargs)

在这种情况下,Foo 实例会被直接创建为 object 类的实例,而不会调用 Foo 的 init() 方法。

此外,如果 new() 方法返回一个非当前类的实例,init() 方法就不会被调用。例如:

class Foo(object):    def __new__(cls, *args, **kwargs):        return Stranger.__new__(cls, *args, **kwargs)

在这种情况下,Foo 实例会被创建为 Stranger 类的实例。

关于单例模式,通常用于确保类只创建一个实例,以节省内存。实现单例的基本方式如下:

class B(object):    __instance = None    def __new__(cls):        if cls.__instance is None:            cls.__instance = object.__new__(cls)        return cls.__instance

在这种情况下,每次调用 B()都会返回同一个实例。

总结:

  • new() 方法的第一个参数是 cls,表示实例化的类。
  • new() 方法必须返回一个实例,可以是当前类的实例或其他类的实例。
  • init() 方法接收 new() 方法返回的实例作为第一个参数,并执行初始化操作。
  • 通过合理定义 new() 方法,可以控制实例化过程,确保类的唯一性或其他特定需求。

    转载地址:http://agafk.baihongyu.com/

    你可能感兴趣的文章
    Python 之匿名函数和偏函数
    查看>>
    python 之栈的实现
    查看>>
    python语音播放
    查看>>
    python语言:装饰器原理
    查看>>
    Python 交互式数据可视化详解
    查看>>
    python语言有哪些优点和缺点_Python有哪些优缺点,你了解吗?
    查看>>
    Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
    查看>>
    Python 从数据库中存储和检索密码的最安全方法
    查看>>
    Python语言及其应用 - 知识点遍历
    查看>>
    Python 优化提速的 8 个小技巧
    查看>>
    Python 余弦相似度与皮尔逊相关系数 计算
    查看>>