元类

python中一切皆对象,类本身也是一个对象,python解释器在加载class的时候就会创建一个对象(这里的对象指类,而非类的实例)

1.什么是元类?

  元类是类的类,是类的模板

  元类是用来控制如何创建类的,正如类是创建对象的模板一样

  元类的实例为类,正如类的实例是对象(f1对象是Foo类的一个实例,Foo类是type类的一个实例)

 

class Foo:
    def __init__(self):
        pass

f1=Foo()        #f1是通过Foo类实例化的对象

print(type(f1))         #<class '__main__.Foo'>
print(type(Foo))        #<class 'type'>

#另一种方法创建类:新式类默认继承object, ‘ ,’是继承的是个元组形式,可以继承多个父类
def __init__(self):
    pass
FFo=type('FFo',(object,),{'x':1,'__init__':__init__})
print(FFo)              #<class '__main__.FFo'>
View Code

 

class Mytype(type):
    def __init__(self,a,b,c):
        print('执行元类')
        print(a,b,c,sep='\n')

    def __call__(self, *args, **kwargs):
        print(self,args,kwargs,sep='----')
        obj=object.__new__(self)        #object.__new__(Foo)---》产生Foo的一个对象
        self.__init__(obj,*args,**kwargs)
        return  obj
class Foo(metaclass=Mytype):    #Foo=Mytype(4个参数  Foo,'Foo',(),{})----》触发Mytype的__init__
    def __init__(self,name):
        self.name=name          #f1.name=name

print(Foo)
f1=Foo('alex')              #Foo()触发的是类Mytype的__call__方法
print(f1)
print(f1.__dict__)

#result:
# 执行元类
# Foo
# ()
# {'__module__': '__main__', '__qualname__': 'Foo', '__init__': <function Foo.__init__ at 0x02F160C0>}
# <class '__main__.Foo'>
# <class '__main__.Foo'>----('alex',)----{}
# <__main__.Foo object at 0x0133DF30>
# {'name': 'alex'}
自定制元类
class Mytype(type):
    def __init__(self,a,b,c):
        print('执行元类')

    def __call__(self, *args, **kwargs):
        obj=object.__new__(self)        #object.__new__(Foo)---》产生Foo的一个对象
        self.__init__(obj,*args,**kwargs)
        return  obj
    
class Foo(metaclass=Mytype):    #Foo=Mytype(4个参数  Foo,'Foo',(),{})----》触发Mytype的__init__
    def __init__(self,name):
        self.name=name          #f1.name=name

print(Foo)
f1=Foo('alex')              #Foo()触发的是类Mytype的__call__方法
print(f1)
print(f1.__dict__)

#result:
# 执行元类
# <class '__main__.Foo'>
# <__main__.Foo object at 0x00E7DA70>
# {'name': 'alex'}
自定制元类精简版

 

posted @ 2019-04-01 20:10  wind_y  阅读(169)  评论(0编辑  收藏  举报