元类--day26

元类
# 元类使用总结:
"""
元类是用于创建类的类
学习元类是为了 能控制类的创建过程 以及 类实例化对象的过程
一.
控制类的创建过程
1.创建一个元类 (需要继承type)
2.覆盖__init__方法 该方法 会将新建的类对象 类名 父类们 名称空间 都传进来 ,
可以利用这些信息在做处理
3.对于需要被控制的类 需要指定metaclass 为上面的元类

二.
控制类实例化对象的过程
1.创建一个元类 (需要继承type)
2.覆盖__call__方法 会将 正在实例化对象的类 调用类是传入的参数 都传进来
3.在__call__方法中 必须要先编写模板代码
3.1创建空对象
3.2调用类的__init__方法来初始化这个空对象
3.3返回该对象
4.加入你需要控制的逻辑

类的三个组成部分
类名 父类们 名称空间

元类 -> 实例化产生 -> 类 -> 实例化产生 -> 对象


"""
"""
一切皆对象
元类是指 用于产生类的类 type就是元类
所有的自定义类都是通过type实例化得来


"""
#创建模块的过程:
#1.创建一个空的名称空间
#2.执行内部的代码
#3.将得到的名字放到名称空间中

# 使用type可以发现 类其实是type类型的实例(对象)
# 我们可以自己调用type来实例化产生一个类

# myclass 包含的代码
code = """
name = "张三"
age = 18
def hello(self):
print("hello %s" % self.name)
"""
#类的名字
class_name = "MyClass"#定义一个类的名字
#类的的父类们
base_classes = (object,)#指定一个类的父类(必须是元组,可以是一个空元组tuple())
#类的名称空间
namespace = {}#新建一个空的名称空间,用来要添加的东西,属性,方法

exec(code,{},namespace)#吧code中的内容添加到类中,这里设置了两个值,就添加到namespace中的局部空间中

res = type(class_name,base_classes,namespace)#用type把类名,父类,和他的名称空间组合起来生成一个类,这个类就是元类

print(Student)
print(res.name)
print(res.age)
print(res.hello)

# 1.类是由type实例化产生的
# 2.我们可以使用type来产生一个类
# 3.一个类是由 类名字 类的父类元祖 类的名称空间 三个部分组成

class Test(object): #Test = type("Test",(object,),{})
pass

猜你喜欢

转载自www.cnblogs.com/wenchen/p/10145558.html