元类

元类

元类是类的类,是类的模版。

元类是控制如何创建类的,正如类是控制如何创建对象的

type是python中默认的一个内建元素,用来直接控制生成类,python 中任何class定义的类其实都是type类实例化的对象

class Foo:
pass
f1 = Foo()
print(type(f1))#结果是:<class '__main__.Foo'> 查看实例所属的类
print(type(Foo))#结果是:<class 'type'> 查看类的类,也就是元类

创建类的两种方法:

方法一:元类type创建类

创建的类名 = type('创建的类名',(所继承的类,),{属性字典})

def __init__(self,name,age):
self.name = name
self.age = age
def test(self):
print('=====>')

Foo = type('Foo',(object,),{'x':1,'__init__':__init__,'test':test})
#此处将数据属性x=1,和函数属性test ,以及__init__一起加入到类的属性字典中了
print(Foo)#<class '__main__.Foo'>
f1 = Foo('alex',18)
print(f1.name)#alex
f1.test()#结果是:=====>

方法二:class创建类

class Foo:
x=1
def __init__(self,name ,age):
self.name = name
self.age = age
def test(self):
print('=====>')
f1 = Foo('alex',18)
f1.test()#结果是:=====>
print(f1.name)#结果是:alex
print(Foo)#结果是:class '__main__.Foo'>

自定义元类

一个类没有声明自己的元类,python默认它的元类就是type,除了使用元类type,用户可以通过继承的type来自定义元类

class MyType(type):
def __init__(self,a,b,c):
print('元类的构造函数执行')
# print(a)#Foo
# print(b)#()
# print(c)#Foo的属性字典
def __call__(self, *args, **kwargs):
# print(self)#结果是:<__main__.MyType object at 0x7f9a43f62b70>
# 此处self是指Foo
# print(args,kwargs)#此处args是指('alex',) kwargs是{}
obj = object.__new__(self)#object.__new__(Foo)
# 此代码是给FOO产生一个对象,即生成一个实例,即;产生f1
self.__init__(obj,*args,**kwargs)#Foo.__init__(f1,*args,**kwargs)
return obj



class Foo(metaclass=MyType):#Foo=MyType(Foo,'Foo',(),{})
def __init__(self,name):#此处self是指实例:f1
self.name =name #f1.name =name


#print(Foo)#<__main__.MyType object at 0x7fde5d062b70>
# Foo()#会触发call 方法
f1= Foo('alex')#实例化会触发call方法,以及init方法
print(f1.__dict__)#{'name': 'alex'}

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/wode110/p/14866826.html