标签:init 父类 过程 对象 执行 用户 call 创建对象 模板
元类是类的类,是类的模板
元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为
元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)
type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象
手动模拟class创建类的过程):将创建类的步骤拆分开,手动去创建
#创建类主要分为三部分 1 类名 2 类的父类 3 类体 #类名 class_name=‘Chinese‘ #类的父类 class_bases=(object,) #类体 class_body=""" country=‘China‘ def __init__(self,name,age): self.name=name self.age=age def talk(self): print(‘%s is talking‘ %self.name) """
步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体的代码
(exec产生名称空间的过程与真正的class过程类似,只是后者会将__开头的属性变形),生成类的局部名称空间,即填充字典class_dic={}
exec(class_body,globals(),class_dic) print(class_dic)
步骤二:调用元类type(也可以自定义)来产生类ChinenseFoo=type(class_name,class_bases,class_dic) #实例化type得到对象Foo
print(Foo)
print(type(Foo))
print(isinstance(Foo,type))
‘‘‘
<class ‘__main__.Chinese‘>
<class ‘type‘>
True
‘‘‘
type 接收三个参数:
一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用户也可以通过继承type来自定义元类
class Mymeta(type): #继承默认元类的一堆属性
def __init__(self,class_name,class_bases,class_dic):
if not class_name.istitle():
raise TypeError(‘类名首字母必须大写‘)
super(Mymeta,self).__init__(class_name,class_bases,class_dic)
def __call__(self, *args, **kwargs):
#self=People
print(self,args,kwargs) #<class ‘__main__.People‘> (‘egg‘, 18) {}
#1、实例化People,产生空对象obj
obj=object.__new__(self)
#2、调用People下的函数__init__,初始化obj
self.__init__(obj,*args,**kwargs)
#3、返回初始化好了的obj
return obj
class People(object,metaclass=Mymeta):
country=‘China‘
def __init__(self,name,age):
self.name=name
self.age=age
def talk(self):
print(‘%s is talking‘ %self.name)
obj=People(‘egg‘,18)
print(obj.__dict__) #{‘name‘: ‘egg‘, ‘age‘: 18}
标签:init 父类 过程 对象 执行 用户 call 创建对象 模板
原文地址:https://www.cnblogs.com/zero1230/p/9966143.html