真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python教程:用__new__ 創(chuàng)建單例模式

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))

輸出:

創(chuàng)新互聯(lián)是一家專業(yè)提供新豐企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為新豐眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

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

2.共享屬性方法

共享屬性:創(chuàng)建實(shí)例時(shí)把所有實(shí)例的__dict__指向同一個(gè)字典,這樣它們具有相同的屬性和方法.

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))

輸出:

  
薩菲03 薩菲03 薩菲03
  

裝飾器版本

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)

輸出:

  
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 0x000000000E8>
true: 這是cls.__v <__main__.Foo object at 0x000000000E8>
true: 這是cls.__v <__main__.Foo object at 0x000000000E8>
true: 這是cls.__v <__main__.Foo object at 0x000000000E8>
<__main__.Foo object at 0x000000000E8> 哈哈 
<__main__.Foo object at 0x000000000E8> 哈哈 
<__main__.Foo object at 0x000000000E8> 哈哈 
<__main__.Foo object at 0x000000000E8> 哈哈 

單例默認(rèn):

'''
學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和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  <__main__.Singleton object at 0x000000000288BEF0>
阿斯蒂芬
<__main__.Singleton object at 0x000000000288BEF0> 阿斯蒂芬02
這是b  <__main__.Singleton object at 0x000000000288BEF0>

文章名稱:Python教程:用__new__ 創(chuàng)建單例模式
標(biāo)題來源:http://weahome.cn/article/dsogehi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部