Эквивалент Python для define_method в Ruby? - PullRequest
4 голосов
/ 27 марта 2011

Существует ли Python-эквивалент для Ruby's define_method, который бы позволял динамически генерировать методы класса? (как видно из примера кода в Википедии )

Ответы [ 4 ]

13 голосов
/ 27 марта 2011

Функции являются первоклассными объектами в 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)
2 голосов
/ 27 марта 2011

В Python вы можете просто установить метод для класса:

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

Любимые вещи возможны с декораторами .

0 голосов
/ 27 марта 2011

Либо посмотрите на абстрактные базовые классы:

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

или

проверьте опции, которые предоставляет вам модуль 'new' (или более новые 'types').

0 голосов
/ 27 марта 2011

Вы просто назначаете функцию в качестве нового атрибута для класса:

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...