博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python单例的一种简单写法
阅读量:6162 次
发布时间:2019-06-21

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

最原始的想法就是每个类都重写new方法。

class Dog:    dog = None    def __new__(cls, *args, **kwargs):        if cls.dog is None:            cls.dog = object.__new__(cls)            print('create singleton over')        return cls.dog    def __init__(self, name):        print('init is called')        self.name = name# 下面这句话会报错,因为Dog.dog目前为None# print(Dog.dog.name)x = Dog('x')y = Dog('y')print(x.name)  # yprint(y.name)  # y

最简单的方法是把重写new函数的工作放到一个父类里面,这样就能够实现:只需要继承父类就能够让自己变成单例。

"""extend this class can make singleton class easily"""class Singleton:    _instance = None    def __new__(cls, *args, **kwargs):        if not cls._instance:            cls._instance = object.__new__(cls)        return cls._instanceclass Dog(Singleton):    def __init__(self, name):        self.name = namex = Dog('x')y = Dog('y')print(x.name, y.name)

Python的单例相对于Java的单例来说,简明直接得多。我们依旧可以像创建对象一样获取单例的引用,而不必像Java那样只能通过一个函数来获取已经存在的对象。但是,Java单例的实现在语言层面上不做任何修改,Python的单例拦截了对象的创建(new)过程。因为Java的单例没有对语言层面做修改,而Python的灵活性使得Java只是Python的一个子集,所以Java单例的那套创建方式在Python这里同样适用。

需要知道的一点是:Python的new函数才是真正的开辟空间的过程,init函数只是赋值、初始化的过程。

在Python中,我们创建的任何一个对象,无需重写setattr方法即可随便往对象上“悬挂”成员变量。

class Ha:    passx = Ha()x.dog = 3print(x.dog)

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

你可能感兴趣的文章
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>
UML类图简明教程
查看>>
java反编译工具(Java Decompiler)
查看>>
Android开发之自定义对话框
查看>>
微信Access Token 缓存方法
查看>>