元类编程
常规方法动态创建元类
做元类编程我们先来了解元类是什么?类是创建对象的对象,而元类就是创建类的类,type就是元类
def create_class(name):
# 判断传入参数
if name == 'user':
# 根据传入参数创建类
class User:
def __str__(self):
return 'User'
# 输出类的地址
return User
elif name == 'xunmi':
class XunMi:
def __str__(self):
return 'XunMi'
return XunMi
if __name__ == '__main__':
# myclass接收到地址
myclass = create_class('user')
# 判断是否完成创建
if myclass is not None:
print(myclass())
这样做有个问题,就是传入的参数必须先要进行事先指定,才能动态创建类,但如果我们事先不知道会有怎样的参数传入,就无法动态创建类
type创建元类
type在大多数情况下是作为查看对象类型的方法,而type还一个功能,就是动态创建类。
语法: ==type(对象名, 父类, 方法(字典类型))==父类和方法默认为空
type('XunMi', (BaseClass, ), {'xunmi': 'test'})
相当于
class Xunmi(BaseClass):
xunmi = 'test'
继承关系与添加函数
- 使用type方法创建的元类中继承关系可以多重继承.需要注意的是当只继承一个类的时,需要在类后添加逗号构成元组
- 字典内不仅能添加类属性,还可以添加方法,需要注意的是,添加到其中的方法最少要有一个参数(和类方法类似)
- 可以添加魔法方法
class BaseClass1(object):
def demo1(self):
return 'demo1'
class BaseClass2(object):
def demo2(self):
return 'demo2'
def Method(self):
return '我是测试方法'
def __len__(self):
return 1024
# 使用type进行元类编程
if __name__ == '__main__':
myclass = type('XunMi', (BaseClass1, BaseClass2), {'xunmi': 'test', 'demo': Method, '__len__': __len__})
data = myclass()
print(data.demo1(), data.demo2(), data.demo(), len(data))