是否有Python的等效方法可以像Ruby的define_method
一样允许动态生成类方法?
(正如在维基百科的Ruby示例代码中所看到的)
在Python中,函数是一等对象,可以被分配给类或实例的属性。实现与维基百科示例相同的方法之一是:
colours = {"black": "000",
"red": "f00",
"green": "0f0",
"yellow": "ff0",
"blue": "00f",
"magenta": "f0f",
"cyan": "0ff",
"white": "fff"}
class MyString(str):
pass
for name, code in colours.iteritems():
def _in_colour(self, code=code):
return '<span style="color: %s">%s</span>' % (code, self)
setattr(MyString, "in_" + name, _in_colour)
>>> class Spam:
... def __init__(self, x):
... self.value = x
...
>>> Spam.getvalue = lambda self: self.value
>>> ham = Spam('ham')
>>> ham.getvalue()
'ham'
你只需要将一个函数分配为类的新属性:
def replacement_method(self):
print self.name
class Foo(object):
def __init__(self, name):
self.name = name
# .... whatever
setattr(Foo, "printMyName", replacement_method) # assign it
Foo("Joe").printMyName() # call it
如果您不需要一个可计算的名称(如维基百科示例中的字符串),您可以使其更加简洁:
Foo.printMyName = replacement_method
code
对于每个方法都是相同的。添加一个虚假的默认参数code=code
,就像name
一样,可以解决这个问题。 - user395760code=code
,您必须像这样将循环变量传递给函数。 - Jochen Ritzelcode=code
而不是name=name
。 - Sven Marnach