python元类__metaclass__

来源:互联网 发布:java中的线程模型包含 编辑:程序博客网 时间:2024/05/16 01:20
<pre name="code" class="python">#python元类,类的创建过程#首先调用type.__new__#然后调用类的构造函数 class.__init__def toString(c):    s="";    if type(c)==tuple:        s="tuple:"        for i in c:            s+=str(i)            s+=","        return s    elif type(c) == dict:        s="dict:"        for k,v in c.items():            s+= "k=%s,v=%s" % (k,v)            s+=","        return s    elif type(c) == list:        s="list:"        for i in c:            s+=str(i)            s+","        return s    else:        return c        class ListMetaClass(type):    def __new__(cls, name, bases, attr):        #对于比较长的代码行,可以使用\来分行        #有没有感觉跟C++的define定义换行的感觉一样(-><*><-)        print('cls=%s, name=%s,bases=%s,attrs=%s'\              % (toString(cls), toString(name), \                 toString(bases), toString(attr)))        attr['add']=lambda self,value:self.append(value)        return type.__new__(cls, name, bases, attr)    class MyList(list):    __metaclass__ = ListMetaClass        if __name__ == "__main__":    myList = MyList()    myList.add(100)    print(myList)        def listAdd(self,value):        self.append(value)            MyList2 = ListMetaClass("MyList2", (list,), dict(add=listAdd))    myList2=MyList2()    myList2.add(1000)    print(myList2)"""程序输出:cls=<class '__main__.ListMetaClass'>, name=MyList,bases=tuple:<type 'list'>,,attrs=dict:k=__module__,v=__main__,k=__metaclass__,v=<class '__main__.ListMetaClass'>,[100]cls=<class '__main__.ListMetaClass'>, name=MyList2,bases=tuple:<type 'list'>,,attrs=dict:k=add,v=<function listAdd at 0x01AACBB0>,[1000]"""    


                                             
1 0
原创粉丝点击