1. 程式人生 > 其它 >類裝飾器的單例模式寫法問題導致的類例項地址不同

類裝飾器的單例模式寫法問題導致的類例項地址不同

技術標籤:python設計模式

類裝飾器的單例模式寫法問題導致的類例項地址不同

def singleton(cls):
    # 單下劃線的作用是這個變數只能在當前模組裡訪問,僅僅是一種提示作用
    # 建立一個字典用來儲存類的例項物件
    _instance = {}

    def _singleton(*args, **kwargs):
        # 先判斷這個類有沒有物件
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)  # 建立一個物件,並儲存到字典當中
        # 將例項物件返回
        return _instance[cls]
    return _singleton

@singleton
class A(object):
    a = 1
    def __init__(self, x=0):
        self.x = x
        print('這是A的類的初始化方法')

class B(object):
    a = 1
    def __init__(self, x=0):
        self.x = x
        print('這是B的類的初始化方法')

a1 = A(2)
a2 = A(3)
print(id(a1), id(a2))
print(a1.x,a2.x)
b1 = singleton(B)(2)
b2 = singleton(B)(3)
print(id(b1), id(b2))
print(b1.x,b2.x)

在這裡插入圖片描述
有沒有大神能解釋這個問題