class MyType(type):
def __init__(self,*args,**kwargs):
print("Mytype __init__",*args,**kwargs)
def __call__(self, *args, **kwargs):
print("Mytype __call__", *args, **kwargs)
obj = self.__new__(self)
print("obj ",obj,*args, **kwargs)
print(self)
self.__init__(obj,*args, **kwargs)
return obj
def __new__(cls, *args, **kwargs):
print("Mytype __new__",*args,**kwargs)
return type.__new__(cls, *args, **kwargs)
class Foo(object):
#__metaclass__=MyType
def __init__(self,name):
self.name = name
print("Foo __init__")
def __new__(cls, *args, **kwargs): #通过__init__来实例化
print("Foo __new__") #cls相当于self相当于Foo 继承父类Foo的__new方法,不继承就没法实例化 return返回在调用
# print(object.__new__(cls)) #Foo对象的内存地址 return返回Foo对象的内存地址,达到继承Foo父类
return object.__new__(cls) #__new__用来创建实例的 继承Foo 必须retutrn object.__new__来传递到.__init__触发__init初始化
f = Foo("Alex") #__new__先于__init__执行
#以下代码在Linux上运行 运行的时候需要将#后面注释去掉
#!-*-coding:utf-8-*-
class MyType(type):
def __init__(self,*args,**kwargs): #第二步
print("Mytype __init__")
def __call__(self, *args, **kwargs):
print("Mytype __call__") #第三步
obj = self.__new__(self) #__call__创建__new__ __new__执行的过程得到的结果传给实例__init__,当做self,开辟了一块内存空间
obj.data="he" #以后所有实例化的类都有一个默认的字典 data={"name":"lei"},自定义初始化动作(默认创建字典data)
self.__init__(obj,*args, **kwargs)
return obj
def __new__(cls, *args, **kwargs): #第一步
print("Mytype __new__")
return type.__new__(cls, *args, **kwargs)
class Foo(object):
__metaclass__=MyType #衔接Mytype 即_metaclass衔接object和type
def __init__(self,name): #第五步
self.name = name
print("Foo __init__")
def __new__(cls, *args, **kwargs): #第四步
print("Foo __new__")
# print(object.__new__(cls))
return object.__new__(cls)
f = Foo("Alex")
#__metaclass__的作用是相当于自己从头到尾写一个类,定制类,定制初始化动作,比如创建默认实例变量
转载于:https://blog.51cto.com/13707996/2331049