Как эффективно и систематически перегружать методы класса Python - PullRequest
1 голос
/ 18 января 2011

Предположим, у вас есть класс Python (> = 2.6) с множеством (сотни!) Методов. Теперь кто-то хочет сделать это подклассом, но понял, что большинству методов базового класса требуется лишь некоторая простая «настройка». Также есть только несколько разных способов настройки этих методов. Некоторые из них включают входные преобразования, некоторые выходные преобразования, некоторые оба.

Чтобы быть более конкретным, я ищу (простое) решение для наследования, где я мог бы просто предоставить базовый класс и список (списков) методов для применения определенных преобразований без добавления этого стандартного кода к каждому перегруженный метод.

Спасибо, съесть

Продолжение.
Основываясь на ответе gabo10yf, я придумал решение как:

class B(object):
    def f1(self, val):
        print '1: ', val
    def f2(self, val):
        print '2: ', val
def decorator(f):
    def g(self, *args, **kwargs):
        print 'entering'
        result= f(self, *args, **kwargs)
    return g

class A(B):
    pass

_overridden= ['f1', 'f2']
def override(cls):
    for name in _overridden:
        setattr(cls, name, decorator(getattr(cls, name).im_func))
override(A)

if __name__== '__main__':
    b= B()
    b.f1(1)
    b.f2(2)
    a= A()
    a.f1(1)
    a.f2(2)

Это действительно похоже на работу. Однако это кажется почти слишком простым, оно, безусловно, должно содержать некоторые мутные проблемы? В любом случае, благодаря вам, все позволили мне понять это!

Ответы [ 4 ]

2 голосов
/ 18 января 2011

Надеюсь, это поможет:

<code>
 # the base class
class B(object):
    def f1(self, val):
        pass
    def f2(self, val):
        pass</p>

<p>def decorator(cls, f):
    def g(self, *args, **kwargs):
        # do stuff
        result = f(self, *args, **kwargs)
        # do more stuff
    return g</p>

<p>class A(B):
    _overridden = ['f1', 'f2']
    @classmethod
    def load(cls):
        for name in cls._overridden:
            setattr(name, decorator(getattr(name).im_func))</p>

<p>A.load()

Возможно, придется внести некоторые изменения для обработки классов и статических методов.

2 голосов
/ 18 января 2011

Я предлагаю использовать некоторую форму Аспектно-ориентированного программирования.С библиотекой Logilab легко обернуть все методы класса.

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

Предположим, что у вас есть класс Python (> = 2.6) с множеством (сотни!) Методов

Затем я проведу рефакторинг класса, потому что дизайн класса нарушен.

Кроме того, вы можете легко достичь заданного результата путем исправления обезьяны экземпляром указанного класса.

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

Я бы рассмотрел декораторы, прежде чем перейти к наследованию.

Я бы также подумал о рефакторинге этого класса - сотни методов предлагают мне "анти-паттерн Бога".

...