簡単にpythonの単一の例のモードのいくつかの書き方を理解します。


方法1:飾り器を使う
装飾器は辞書オブジェクトinstancesを維持し、単一の例が存在しない限り、作成され、既に存在しています。

def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2
方法二:ベースクラスを使う
同前new_実際にインスタンスオブジェクトを作成する方法ですので、ベースクラスのnew_方法を使用して、オブジェクトを作成するときに一例だけを生成することを保証します。

class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True
方法の3:元を使う
タプル(参照:Pythonのタプルを深く理解する)は、クラスのオブジェクトを作成するクラスで、クラスのオブジェクトがインスタンスオブジェクトを作成する際には必ず呼び出します。コールバックメソッドですので、__u u_u uを呼び出しています。コールバックいつでも一例だけ作成すればいいです。typeはpythonの一つの元です。

class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class Foo(object):
__metaclass__ = Singleton
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。