python 대상 을 위 한 단일 예 모드

2693 단어 python
일례 모드
어떤 방법 을 바탕 으로 클래스 실례 화 를 통 해 얻 은 대상 이나 메모리 주소 가 같은 것 을 가리킨다.
모두 네 가지 방법 이 있 습 니 다.마지막 방법 은 가방 으로 가 져 와 서 사용 하 는 것 입 니 다.
방식 1
   
settings.py     :
ip = '1.1.1.1'
port = 3306

   
import settings

class Mysql:
    __instance = None
    
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod
    def from_conf(cls):
        if not cls.__instance: #cls = Mysql ==>  Mysql.__instance  ,      
            cls.__instance = cls(settings.ip, settings.port)# ===>  Mysql(settings.ip, settings.port)     
        return cls.__instance

obj1 = Mysql.from_conf()
obj2 = Mysql.from_conf()
obj3 = Mysql('1.1.1.10', 3302)
print(obj1)
print(obj2)
print(obj3)

   
class Mysql:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod
    def from_conf(cls):
        if not hasattr(cls,'_%s__instance'%cls.__name__):#      hasattr   
            cls.__instance = cls(settings.ip, settings.port)# ===>  Mysql(settings.ip, settings.port)     
        return cls.__instance


obj1 = Mysql.from_conf()
obj2 = Mysql.from_conf()
obj3 = Mysql('1.1.1.10', 3302)
print(obj1)
print(obj2)
print(obj3)


방식 2

def singleton(cls):
    _instance = cls(settings.ip, settings.port)  #        settings    
    def wrapper(*args, **kwargs):  # *args,**kwargs      
        if args or kwargs:  #      
            obj = cls(*args, **kwargs)  #      obj
            return obj
        return _instance  #    wrapper    ,      _instance
    return wrapper

@singleton  # Mysql=singleton(Mysql)==>Mysql = wrapper
class Mysql:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

obj1 = Mysql()  #    Mysql   wrapper  ,     wrapper
obj2 = Mysql()
obj3 = Mysql('1.1.1.10', 3302)  # obj3 = wrapper('1.1.1.10',3302)
print(obj1)
print(obj2)
print(obj3)

방 식 삼
class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic):#self = Mysql
        super().__init__(class_name,class_bases,class_dic)
        self.__instance = self(settings.ip,settings.port)

    def __call__(self, *args, **kwargs):
        if args or kwargs:
            obj = self.__new__(self) #       
            self.__init__(obj,*args, **kwargs) #      
            return obj #         

        return self.__instance#        Msql  


class Mysql(metaclass=Mymeta): #Mysql = Mymeta(...)
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port


obj1 = Mysql()
obj2 = Mysql()
obj3 = Mysql('1.1.1.2', 3307)
print(obj1)
print(obj2)
print(obj3)

좋은 웹페이지 즐겨찾기