Python教程:用__new__ 创建单例模式

1.用 __new__方法

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls,'_instance'):
            cls._instance=super(Singleton,cls).__new__(cls)
#            cls.__instance = object.__new__(cls) #这样也可以
        return cls._instance
a = Singleton()
b = Singleton()
c = Singleton()
print(a,id(a))
print(b,id(b))
print(c,id(c))

输出:

<__main__.Singleton object at 0x000000000287A240> 42443328
<__main__.Singleton object at 0x000000000287A240> 42443328
<__main__.Singleton object at 0x000000000287A240> 42443328

2.共享属性方法

共享属性:创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.

class Borg(object):
    _state = {}
    def __new__(cls, *args, **kw):
        ob = super(Borg, cls).__new__(cls, *args, **kw)
        ob.__dict__ = cls._state
        return ob
class MyClass2(Borg):
    a = 1
b1 = MyClass2()
b2 = MyClass2()
b3 = MyClass2()
b1.a='萨菲的'
b2.a='萨菲02'
b1.a='萨菲03'
MyClass2.a = 333
print(id(b1),id(b2),id(b3))
print(b1.a,b3.a,b2.a)
print(id(b1.a),id(b2.a),id(b3.a))

输出:

42902024 42902080 42901688
萨菲03 萨菲03 萨菲03
167568080 167568080 167568080

装饰器版本

def singleton(cls, *args, **kw):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return getinstance
@singleton
class MyClass:
    a = 1
b1 = MyClass()
b2 = MyClass()
b3 = MyClass()
print(id(b1),id(b2),id(b3))
print(b1.a,b3.a,b2.a)

输出:

42712928 42712928 42712928
1 1 1

类方法版

class Foo():
    __v = None
    @classmethod
    def get_instance(cls):
        if cls.__v:
            print("true: 这是cls.__v",cls.__v)
            return cls.__v
        else:
            print("false: 这是cls.__v", cls.__v)
            cls.__v = Foo()
            print("false_1: 这是cls.__v", cls.__v)
            return cls.__v
obj = Foo.get_instance()
obj1 = Foo.get_instance()
obj2 = Foo.get_instance()
obj3 = Foo.get_instance()
print(obj,'哈哈',id(obj))
print(obj1,'哈哈',id(obj1))
print(obj2,'哈哈',id(obj2))
print(obj3,'哈哈',id(obj3))

输出:

false: 这是cls.__v None
false_1: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
true: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
true: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
true: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
<__main__.Foo object at 0x00000000025002E8> 哈哈 38798056
<__main__.Foo object at 0x00000000025002E8> 哈哈 38798056
<__main__.Foo object at 0x00000000025002E8> 哈哈 38798056
<__main__.Foo object at 0x00000000025002E8> 哈哈 38798056

单例默认:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Singleton(object):
    def __new__(cls,*args,**kwargs):
        if not hasattr(cls,'_instance'):
            print('你好啊',)
            cls._instance = super(Singleton,cls).__new__(cls)
            print(cls._instance, '阿斯蒂芬01')
            return cls._instance
        print( '阿斯蒂芬')
        print(cls._instance, '阿斯蒂芬02')
        return cls._instance
        
a = Singleton()
print('这是a',id(a),a)
b = Singleton()
print('这是b',id(b),b)

输出:

你好啊
<__main__.Singleton object at 0x000000000288BEF0> 阿斯蒂芬01
这是a 42516208 <__main__.Singleton object at 0x000000000288BEF0>
阿斯蒂芬
<__main__.Singleton object at 0x000000000288BEF0> 阿斯蒂芬02
这是b 42516208 <__main__.Singleton object at 0x000000000288BEF0>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python教程:用__new__ 创建单例模式 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Python学习:获取代理ip以及使用

    python爬虫浏览器伪装 #导入urllib.request模块 import urllib.request #设置请求头 headers=(“User-Agent”,”Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22…

    Python开发 2023年4月2日
    00
  • 一篇文章轻松学会python装饰器

    1. 函数 在python中,函数通过def关键字、函数名和可选的参数列表定义。通过return关键字返回值。我们举例来说明如何定义和调用一个简单的函数: >>> def foo(): … return 1 >>> foo() 1 方法体(当然多行也是一样的)是必须的,通过缩进来表示,在方法名的后面加上双括号()就能够…

    Python开发 2023年4月2日
    00
  • 5个非常有意思的python代码,谁运行谁知道

    Python 能做很多无聊,但有意思的事情,例如接下来的一些案例。 Python 整蛊程序 以下程序,不要发代码,要不实现不了你整蛊的目的。 要打包成一个 exe 程序,发给朋友才有意思。 使用 pip install pyinstaller。 打包命令如下: pyinstaller -F 文件名.py 过程中如果出现 BUG(一般是编码错误),点击导航查看…

    Python开发 2023年4月2日
    00
  • python去除列表中重复元素的方法

    列表中元素位置的索引用的是L.index 本文实例讲述了Python去除列表中重复元素的方法。分享给大家供大家参考。具体如下: 比较容易记忆的是用内置的set l1 = [‘b’,’c’,’d’,’b’,’c’,’a’,’a’] l2 = list(set(l1)) print (l2) 还有一种据说速度更快的,没测试过两者的速度差别 l1 = [‘b’,’…

    Python开发 2023年4月2日
    00
  • python教程:shutil高级文件操作

    1、shutil高级文件操作模块 shutil模块提供了大量的文件的高级操作。特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作。对单个文件的操作也可参见os模块。 2、shutil模块的拷贝方法 >>> import shutil >>> shutil.chown(‘test.txt’,user=’mysql’…

    Python开发 2023年3月31日
    00
  • Python重用父类方法

    一、重用父类方法 1 与继承没有关系的重用 指名道姓的使用 在子类里想用父类的方法,我们可以直接用父类名.方法名()—>父类里方法有几个参数就传几个参数 我们看起来是子类在调用父类的方法,但是实际上,这并没有存在继承关系 class A: def __init__(self,name,age): self.name=name self.age=ag…

    Python开发 2023年4月2日
    00
  • Python学习:数据类型转换的方法教程

    1.type() 函数 使用 type() 函数可以查看数据类型。 示例: >>> type(123) <class ‘int’> >>> type(12.3) <class ‘float’> >>> type(“abc”) <class ‘str’> >>…

    Python开发 2023年4月2日
    00
  • python学习:各种推导式玩法-推导式套路

    1.推导式套路 除了最简单的列表推导式和生成器表达式,其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式。 variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res:  列表生成元素表达式,可以是有返回值的函…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部