恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类。
代码如下,这是一个使用了函数做元类传递给类:
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方法返回时可以使用任意新式类,但不要使用自身。)