面向对象__metaclass__,__new__

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上运行 运行的时候需要将#后面注释去掉
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__的作用是相当于自己从头到尾写一个类,定制类,定制初始化动作,比如创建默认实例变量


猜你喜欢

转载自blog.51cto.com/13707996/2331049