Python中等同于Ruby的define_method是什么?

6 投票
3 回答
1082 浏览
提问于 2025-04-16 14:31

有没有Python中类似于Ruby的define_method的东西,可以用来动态生成类的方法?(可以在维基百科的Ruby示例代码中看到)

3 个回答

0

你只需要把一个函数当作新的属性加到一个类里:

 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
2

在Python中,你可以直接在一个类上设置一个方法:

>>> class Spam:
...     def __init__(self, x):
...         self.value = x
...
>>> Spam.getvalue = lambda self: self.value
>>> ham = Spam('ham')
>>> ham.getvalue()
'ham'

如果想要更复杂的功能,可以使用装饰器

14

在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)

撰写回答