>백엔드 개발 >파이썬 튜토리얼 >Python에서 싱글턴 패턴을 구현하는 방법

Python에서 싱글턴 패턴을 구현하는 방법

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼원래의
2019-06-22 09:28:412618검색

Python에서 싱글턴 패턴을 구현하는 방법

파이썬에서 싱글턴 패턴을 구현하는 방법은 무엇인가요? 다음은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.