Python相当于Ruby的define_method?

时间:2011-03-27 12:39:57

标签: python ruby

Ruby的define_method是否有Python等价物,它允许动态生成类方法? (可以在维基百科的Ruby example code中看到)

4 个答案:

答案 0 :(得分:13)

函数是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)

答案 1 :(得分:2)

在Python中,您只需在类上设置方法:

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

decorators

可以使用。{p>

答案 2 :(得分: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

答案 3 :(得分:-2)

要么考虑抽象基类:

http://docs.python.org/library/abc.html

检查“新”(或更新的“类型”)模块为您提供的选项。