python元类执行顺序及元类单例模式实现

以Server类为例:在定义好Server类的时候已经执行Enum的__new__方法和__init__方法,实例化Server类的时候才会执行Server类的__new__方法和__init__方法

单例模式:是在类实例化的时候会执行元类的__call__方法,我们在定义类的时候就已经执行了元类的__init__方法,从而确认定义类是否有__init__方法,如果有__init__方法,则根据参数生成key,如果没有__init__方法,则以类本身作为key

import collections


class Enum(type):
    _init={}

    def __init__(self,name,base,class_dict):
        super(Enum, self).__init__(name,base,class_dict)
        print(id(self))

    def __new__(cls, *args, **kwargs):
        c=super().__new__(cls,*args,**kwargs)
        print('enum')
        print(args,kwargs)
        print(id(cls),id(c))
        return c


class Server(object,metaclass=Enum):

    def __init__(self,host,port):
        self.host=host
        self.port=port

    def __new__(cls,*args,**kwargs):
        c=super().__new__(cls)
        print('Server')
        return c


class SingleMetaClass(type):
    _dct={}
    _init={}
    def __init__(self,class_name,base,class_dict):
        self._init[self]=class_dict.get('__init__',None)
        super(SingleMetaClass, self).__init__(class_name,base,class_dict)

    def __call__(self, *args, **kwargs):
        if self._init[self] is None:
            key=self
        else:
            key=(self,args,repr(kwargs))
        if self._dct.get(key) is None:
            self._dct[key]=super().__call__(*args,**kwargs)
        return self._dct[key]


class Coon(metaclass=SingleMetaClass):

    def __init__(self,a,b):
        print(a,b)


if __name__ == '__main__':
    Server('localhost','8000')
    print(Coon(1, b=2))
    print(Coon(1, b=2))
    print(Coon(1, 3))

你可能感兴趣的:(python,numpy,开发语言)