Metaclass中的动态函数创建

Lap*_*anc 2 python

我正在Python 2.7 Metaprogramming中完成我的第一步,并编写了以下代码:

class MetaClass(type):
    def __init__(cls, name, bases, attrs):
        print "Defining class : %s" % (cls,)
        ra = [(key, value) for key, value in cls.__dict__.items() if not key.startswith('_')]
        for (k, v) in ra:
            setattr(cls, "_"+k, v)
            def get_a(cls):
                print "Getting value of " + k
            get_a(cls)
            get_a.__name__ = "get_" + k
            get_a.__doc__ = "Documentation for get_" + k
            setattr(cls,get_a.__name__, get_a)
            print get_a.__name__, get_a.__doc__

class BaseObject(object):
    __metaclass__ = MetaClass
    pass
Run Code Online (Sandbox Code Playgroud)

然后 :

class Pers(BaseObject):
    nom = "Toune"
    prenom = "Fabien"

p = Pers()
Run Code Online (Sandbox Code Playgroud)

我期望有两个不同的函数"p.get_nom()"和"p.get_prenom()"顺便说一下,这两个函数返回相同的结果("获取prenom的值"),而它们有不同的名称doc

我错过了什么?

Ign*_*ams 5

啊,是的,关闭.阅读那篇文章,然后回来.

    for (k, v) in ra:
        setattr(cls, "_"+k, v)
        def new_method(val):
            def inner_get_a(cls):
                print "Getting value of " + val
            return inner_get_a
        get_a = new_method(k)
        get_a(cls)
        get_a.__name__ = "get_" + k
        get_a.__doc__ = "Documentation for get_" + k
        setattr(cls,get_a.__name__, get_a)
        print get_a.__name__, get_a.__doc__
Run Code Online (Sandbox Code Playgroud)