python 元类

这两天没写blog整个人都废了(

写blog真的是促进学习的好方法(

在python中类也是可以动态生成的,方法就是使用metaclass。具体的实现流程就是先定义一个元类,然后创建类的时候为其添加上metaclass属性,引入一个元类,则可以动态的为这个类添加属性或方法。

首先,我们知道,在python中,类是通过type方法来产生的,而metaclass也是用来生成类的,所以metaclass类需要继承type类。

通过修改metaclass类中的__new__方法来动态修改类。

__new__方法需要四个参数

当前准备创建的类的对象、类的名字、类继承的父类集合、类的元素集合。

可以通过__new__方法对类进行编辑。

举个例子:

class mymetaclass(type):
    def __new__(cls,name,bases,attrs):
        def add(self,value):
            self.value = self.value+value;
        attrs['value'] = 1;
        attrs['add'] = add;
        return type.__new__(cls,name,bases,attrs);


class test(object,metaclass = mymetaclass):
    pass;

temp = test();
print(temp.value);
temp.add(1);
print(temp.value);

输出:

1

2

需要注意的是,一个类所调用的metaclass必须是其父类使用的metaclass的子类,如果多重继承中,多个父类所拥有的metaclass不同,则会出现问题。

下面两种情况是会报错的:

class ametaclass(type):
    def __new__(cls,name,bases,attrs):
        return type.__new__(cls,name,bases,attrs);

class bmetaclass(type):
    def __new__(cls,name,bases,attrs):
        return type.__new__(cls,name,bases,attrs);

class testa(object,metaclass = ametaclass):
    pass;

class testb(object,metaclass = bmetaclass):
    pass;

#error
class testc(testa,testb):
    pass;

#error
class testd(testa,metaclass = bmetaclass):
    pass;

temp = testd();

解决方案为:

class cmetaclass(ametaclass,bmetaclass):
    pass;

class teste(testa,testb,metaclass = cmetaclass):
    pass;

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据