恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类。
代码如下,这是一个使用了函数做元类传递给类:
input: def upper_attr(class_name, class_parents, class_attr): """ 返回一个对象,将属性都改为大写的形式 :param class_name: 类的名称 :param class_parents: 类的父类tuple :param class_attr: 类的参数 :return: 返回类 """ # 生成了一个generator attrs = ((name, value) for name, value in class_attr.items() if not name.startswith('__')) uppercase_attrs = dict((name.upper(), value) for name, value in attrs) return type(class_name, class_parents, uppercase_attrs) __metaclass__ = upper_attr pw = upper_attr('Trick', (), {'bar': 0}) print hasattr(pw, 'bar') print hasattr(pw, 'BAR') print pw.BAR output: False True 0
upper_attr函数用来接收参数:类名,类的父类,类的属性,作用是将传入的类的属性装化成大写,传给type,使用type创建一个类,新的类就拥有属性BAR,而不是bar,这样我们就可以使用元类创建特性的类
type是一个元类,定义一个元类可以继承type(这里不多介绍type)
代码二:
class UpperAttrMetaClass(type): def __new__(mcs, class_name, class_parents, class_attr): attrs = ((name, value) for name, value in class_attr.items() if not name.startswith('__')) uppercase_attrs = dict((name.upper(), value) for name, value in attrs) return super(UpperAttrMetaClass, mcs).__new__(mcs, class_name, class_parents, uppercase_attrs) class Trick(object): __metaclass__ = UpperAttrMetaClass bar = 12 money = 'unlimited' print Trick.BAR print Trick.MONEY
使用一个正式类来作为元类传递给__metaclass__,作用如上,跟我之前写的那个有点相似,这里创建类的时候有点不一样,是python版本不一样的问题,但都是使用metaclass创建类,metaclass的new方法相当于类创建实例的new方法,一个是为init初始化实例提供实例,一个是初始化类。(注意使用new方法返回时可以使用任意新式类,但不要使用自身。)