一、类由谁创建?
类默认由type来创建
#传统方式
class Foo(object):
v1=123
def func(self):
return 1
#另一种方式
Foo=type("Foo",(object,),{"v1":123,"func":lambda self:1})
二、什么是元类?
元类,指定类由谁来创建
#type创建Foo类型
class Foo(object):
pass
# MyTypec创建Foo类型
class Foo(object,metaclass=MyType):
pass
ps:类加括号得到对象,执行__init__方法,对象加括号会执行其他方法、
class MyType(type):
def __init__(self,*args,**kwarges):
super().__init__(*args,**kwarges)
def __new__(cls,*args,**kwarges):
#创建类
new_cls=super().__new__(cls,*args,**kwarges)
return new_cls
def __call__(self,*args,**kwarges):
#调用自己的__new__方法创建对象
empty_object=self.__new__(self)
#调用自己的__init__方法初始化对象
self.__init__(empty_object,*args,**kwarges)
return empty_object
#Foo类其实是 MyType 的一个对象
class Foo(object,metaclass=MyType):
def __init__(self,name):
self.name=name
def __call__(self,*args,**kwarges):
print("myself")
v1=Foo()#执行MyType中的__call__方法
v1()#执行Foo中的__call__方法
三、单例模式
在类名后加上metaclass=MyType就可以实现单例模式。
如果不想每一个类都写metaclass=MyType,可以只在一个类后写metaclass=MyType,其他类只需继承它就可以。