博客
关于我
python __new__中单例的作用
阅读量:798 次
发布时间: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/

    你可能感兴趣的文章
    PyQt 正确使用 emit() 和 pyqtSignal()
    查看>>
    PyQT-将文件复制到剪贴板
    查看>>
    PyQt4, class:mouseButtons用法
    查看>>
    PyQt5 - QThread:在线程仍在运行时被销毁
    查看>>
    PyQt5 TabWidget选项卡BarClicked TypeError:本机Qt信号不可调用
    查看>>
    PyQt5 按钮运行功能和更新 LCD
    查看>>
    pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)
    查看>>
    PyQt5:如何安装/运行 Qt 设计器
    查看>>
    PyQt5——pyqtgraph绘图大招
    查看>>
    PyQt5——多窗口之间数据处理
    查看>>
    PyQt5——多线程、信号与槽
    查看>>
    PyQt5——开发地图软件
    查看>>
    PyQt5——装饰器信号与槽
    查看>>
    PyQt5——软件密码登陆跳转主界面
    查看>>
    PyQt5——通过信号与槽进行数据传输
    查看>>
    PyQt5“定时器不能从另一个线程启动“更改 QLabel 的大小时出错
    查看>>
    pyqt5不显示窗口
    查看>>
    pyqt5任意组件的拖拽问题
    查看>>
    PyQt5信号与槽学习笔记——自定义信号与槽(二)
    查看>>
    PyQt5学习笔记——信号与槽
    查看>>