파이썬에서 싱글턴 패턴을 구현하는 방법은 무엇인가요? 다음은 7가지 방법입니다.
하나: staticmethod
코드는 다음과 같습니다. # 🎜🎜#
class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instance a = Singleton.get_instance() b = Singleton.get_instance() print('a id=', id(a)) print('b id=', id(b))이 방법의 요점은 __init__에서 예외를 발생시키고, 클래스를 통한 인스턴스화를 금지하며, 클래스를 통해서는 인스턴스화할 수 없기 때문에 정적 get_instance 함수를 통해서만 인스턴스를 얻는 것입니다. 상위 클래스 object.__new__를 통해 인스턴스화될 수 있습니다.
Two: classmethod
방법 1과 유사, 코드:class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(cls): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instance a = Singleton.get_instance() b = Singleton.get_instance() print('a id=', id(a)) print('b id=', id(b))이 방법의 요점은_ _init__는 예외를 발생시키고 클래스를 통한 인스턴스화를 금지합니다. 인스턴스는 클래스를 통해 인스턴스화될 수 없기 때문에 정적 get_instance 함수를 통해서만 얻을 수 있습니다. 정적 get_instance 함수는 상위 클래스 객체를 통해 인스턴스화될 수 있습니다.
Three: 클래스 속성 메서드
는 메서드 1과 유사합니다. 코드는class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instance a = Singleton.get_instance() b = Singleton.get_instance() print(id(a)) print(id(b))핵심 사항 이 메소드는 __init__에서 예외가 발생하며 클래스를 통한 인스턴스화는 금지됩니다. 클래스를 통해 인스턴스화할 수 없기 때문에 인스턴스는 정적 get_instance 함수를 통해서만 얻을 수 있으며 정적 get_instance 함수는 상위 클래스 객체를 통해 인스턴스화할 수 있습니다. .
Four:__new__
일반적인 방법, 코드는 다음과 같습니다.class Singleton(object): instance = None def __new__(cls, *args, **kw): if not cls.instance: # cls.instance = object.__new__(cls, *args) cls.instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls.instance a = Singleton() b = Singleton() print(id(a)) print(id(b))관련 권장 사항: "# 🎜🎜 #Python 비디오 튜토리얼Five: Decorator
코드는 다음과 같습니다:
def Singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance class MyClass: pass a = MyClass() b = MyClass() c = MyClass() print(id(a)) print(id(b)) print(id(c))# 🎜🎜## 🎜🎜#6: Metaclass
python2 버전: class Singleton(type):
def __init__(cls, name, bases, dct):
super(Singleton, cls).__init__(name, bases, dct)
cls.instance = None
def __call__(cls, *args):
if cls.instance is None:
cls.instance = super(Singleton, cls).__call__(*args)
return cls.instance
class MyClass(object):
__metaclass__ = Singleton
a = MyClass()
b = MyClass()
c = MyClass()
print(id(a))
print(id(b))
print(id(c))
print(a is b)
print(a is c)
또는:
class Singleton(type): def __new__(cls, name, bases, attrs): attrs["_instance"] = None return super(Singleton, cls).__new__(cls, name, bases, attrs) def __call__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instance class Foo(object): __metaclass__ = Singleton x = Foo() y = Foo() print(id(x)) print(id(y))
python3 버전: #🎜 🎜## 🎜🎜#
class Singleton(type): def __new__(cls, name, bases, attrs): attrs['instance'] = None return super(Singleton, cls).__new__(cls, name, bases, attrs) def __call__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args, **kwargs) return cls.instance class Foo(metaclass=Singleton): pass x = Foo() y = Foo() print(id(x)) print(id(y))
Seven: Name Coverage
class Singleton(object): def foo(self): print('foo') def __call__(self): return self Singleton = Singleton() Singleton.foo() a = Singleton() b = Singleton() print(id(a)) print(id(b))
위 내용은 Python에서 싱글턴 패턴을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!