Pythonでは装飾器を用いて単例モードを実現

902 ワード

Pythonでは装飾器を用いて単例モードを実現
Pythonのアクセラレータはクラスの上に使用され、クラスインスタンスオブジェクトの作成をブロックすることができるため、クラスが作成したすべてのインスタンスを管理することができるため、この特徴を利用して単例モードを実現することができる.
具体的なコードは以下の通りです.
def singleton(aClass):
    instance = None
    def onCall(*args):
        nonlocal instance
        if instance == None:
            instance = aClass(*args)
        return instance
    return onCall

ここでnonlocalを用いて,ネスト関数がその外部関数の局所変数にアクセスできるようにし,さらにクラスごとに状態変数を保存する.
次のように使用します.
@singleton
class student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
s1 = student('Robert Smith',30)
s2 = student('Lebron James',34)

s1.age
Out[111]: 30

s1.name
Out[112]: 'Robert Smith'

id(s1)
Out[113]: 148263656

s2.age
Out[114]: 30

s2.name
Out[115]: 'Robert Smith'

id(s2)
Out[116]: 148263656