元类编程

常规方法动态创建元类

做元类编程我们先来了解元类是什么?类是创建对象的对象,而元类就是创建类的类,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'

继承关系与添加函数

  1. 使用type方法创建的元类中继承关系可以多重继承.需要注意的是当只继承一个类的时,需要在类后添加逗号构成元组
  2. 字典内不仅能添加类属性,还可以添加方法,需要注意的是,添加到其中的方法最少要有一个参数(和类方法类似)
  3. 可以添加魔法方法
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))