использование несвязанных методов в другом классе Python - PullRequest
3 голосов
/ 18 апреля 2011

У меня есть несвязанный метод как <unbound method foo.ops>, я хотел бы использовать тот же метод с другим классом.возьмите пример

class foo2(object):
  pass

foo2.ops = foo.ops

однако

obj = foo2()
obj.ops()

raises TypeError: unbound method ops() must be called with foo instance as first argument (got nothing instead)

Ответы [ 2 ]

11 голосов
/ 18 апреля 2011

Если вы хотите добавить один и тот же метод к нескольким несвязанным классам (например, сделать AOP), не копируйте несвязанный метод из одного из них. Вместо этого определите простую функцию и назначьте ее в качестве метода для каждого класса.

Обычно лучшим способом сделать это является миксин (используя простое наследование) или метакласс (синтаксис декоратора класса аккуратный).

Если вы просто обязаны украсть метод из класса (например, тот, который вы не контролируете), вы можете извлечь его из оболочки 'unbound method': foo2.ops.im_func; это простая функция, и вы можете назначить ее в качестве метода другому классу.

0 голосов
/ 18 апреля 2011

Если вы хотите реализовать «методы класса», вы должны вызывать его соответствующим образом, без экземпляра объекта

class foo:
    @staticmethod
    def ops(name):
        print "Hi there",name

foo.ops("Peter")

class foo2:
    pass

foo2.ops = staticmethod(foo.ops)

foo2.ops('aa')

(скопировать из http://code.activestate.com/recipes/52304-static-methods-aka-class-methods-in-python/)

, если вам нужен метод экземпляра, используйте наследство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...