Python3基础-元类

1、引子

class Foo:
    pass
#所有的对象都是实例化或者说调用类而得到的(调用类的过程称为类的实例化)
f1 = Foo()  #f1是通过Foo类实例化的对象
print(type(f1)) #输出:<class '__main__.Foo'>  表示,obj对象由Foo类创建

python中一切皆是对象

类本身也是一个对象,当使用关键字class的时候,python解释器在加载class的时候就会创建一个对象(这里的对象指的是类而非类的实例)

print(type(Foo)) #输出<class 'type'> 证明了是调用type这个元类而产生的Foo,即是默认的元类为type

2、元类

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

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

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

注意:type是python的一个内建元素,用来控制生成类,python中任何class 定义的类都是type类实例化的对象

语法:想要生成的类名 = type(想要生成的类名,(继承的类默认objec,),属性字典{'x':1})。

注意:type中有三个参数,第一个参数是想要生成的类名为字符串类型;第二个参数是继承的类默认为obje为元组类型;第三个参数为生成的类的属性字典为字典类型。
#元类的创建方法
def __init__(self,name,age):
    self.name = name
    self.age = age

def test(self,val):
    self.name = val
    return  self.name

test = type('test',(object,),{'x':1,'__init__':__init__,'test':test})
print(test)
print(test.__dict__)
t1 = test('花花',30)
print(t1.x)
print(t1.age)
print(t1.test('小花'))

3、MetaClass作为创建类的类,,可以通过定义__new__和__init__来分别创建类对象和初始化(修改)类的属性

 一个类没有声明自己的元类,默认他的元类就是type,除了使用内置元类type,我们也可以通过继承type来自定义元类,然后使用metaclass关键字参数为一个类指定元类。

#自定义元类
class Mytype(type):
    def __init__(self,a,b,c):
        print('元类的析构函数执行')
        print(self)

    def __call__(self, *args, **kwargs):
        print('self====',self)
        print(args,kwargs)
        # self是Meta_Type的实例,也就是Foo
        # 因为每个类都默认继承object,所以可以调用__new__(Foo)方法,来实例化一个对象f1 == object.__new__(Foo)  ==> f1
        obj = object.__new__(self) #object.__new__(Foo)
        print(obj)
        # 调用Foo的构造函数实例化对象 == Foo.__init__(f1,*args,**kwargs)
        self.__init__(obj,*args,**kwargs)  #Foo.__init__()
        return  obj
class Foo(metaclass=Mytype):  #Foo = Mytype(Foo,'Foo',(),{})
    def __init__(self,name):
        self.name = name  #f1.name = name

#print(Foo)
# #当Foo()时,表示执行了Foo,则会调用元类的__call__,__call__中会生成对象f1,并且调用Foo下的__init__方法,最终完成实例化
f1= Foo('susu')
print(f1.__dict__)
# print(f1)

 

 

 

 

posted @ 2019-11-29 17:38  槑槑DE  阅读(109)  评论(0编辑  收藏  举报