恩,对元类理解又有新的收获,其实类似于装饰器,只不过装饰器是修饰函数,元类用来定制一个类。

代码如下,这是一个使用了函数做元类传递给类:

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方法返回时可以使用任意新式类,但不要使用自身。)

 

版权声明:本文为chilo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chilo/p/8681372.html