Pythonでは装飾器を用いて単例モードを実現
902 ワード
Pythonでは装飾器を用いて単例モードを実現
Pythonのアクセラレータはクラスの上に使用され、クラスインスタンスオブジェクトの作成をブロックすることができるため、クラスが作成したすべてのインスタンスを管理することができるため、この特徴を利用して単例モードを実現することができる.
具体的なコードは以下の通りです.
ここでnonlocalを用いて,ネスト関数がその外部関数の局所変数にアクセスできるようにし,さらにクラスごとに状態変数を保存する.
次のように使用します.
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