以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))