我正在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
我错过了什么?
啊,是的,关闭.阅读那篇文章,然后回来.
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)