Украшение метода родительского класса - PullRequest
1 голос
/ 16 сентября 2008

Я хотел бы создать дочерний класс, у которого есть метод родительского класса, где этот метод является 'classmethod' в дочернем классе, но не в родительском классе.

По сути, я пытаюсь выполнить следующее:

class foo(Object):
    def meth1(self, val):
        self.value = val

class bar(foo):
    meth1 = classmethod(foo.meth1)

Ответы [ 3 ]

3 голосов
/ 16 сентября 2008

Я также не совсем уверен, какое именно поведение вы хотите, но предполагаю, что вы хотите, чтобы bar.meth1 (42) был эквивалентен foo.meth1, являющемуся классом метода bar (а "self" - это класс ), то вы можете получить это с помощью:

def convert_to_classmethod(method):
    return classmethod(method.im_func)

class bar(foo):
    meth1 = convert_to_classmethod(foo.meth1)

Проблема с classmethod (foo.meth1) заключается в том, что foo.meth1 уже преобразован в метод со специальным значением для первого параметра. Вам нужно отменить это и посмотреть на базовый объект функции, переосмысливая, что означает «я».

Я бы также предупредил, что это довольно странная вещь, и поэтому она может вызвать путаницу у любого, кто читает ваш код. Возможно, вам лучше подумать над другим решением вашей проблемы.

3 голосов
/ 16 сентября 2008

Чего ты пытаешься достичь? Если бы я видел такую ​​конструкцию в живом коде Python, я бы подумал об избиении оригинального программиста.

0 голосов
/ 16 сентября 2008

Вопрос, как он был поставлен, кажется мне довольно странным: я не понимаю, почему кто-то хотел бы сделать это. Возможно, вы неправильно понимаете, что такое «метод класса» в Python (он немного отличается от, скажем, статического метода в Java).

Обычный метод более или менее представляет собой просто функцию, которая принимает в качестве первого аргумента (обычно называемый "self") экземпляр класса и которая вызывается как ".".

Метод класса более или менее представляет собой просто функцию, которая принимает в качестве первого аргумента (часто называемый "cls") класс, и который можно вызывать как "." ИЛИ как ".".

Учитывая это и приведенный выше код, что бы вы ожидали, если бы кто-то создал экземпляр bar и вызвал для него meth1?

bar1 = bar()
bar1.meth1("xyz")

Когда вызывается код для meth1, ему передаются два аргумента 'self' и 'val'. Я предполагаю, что вы ожидаете, что «xyz» будет передано для «val», но как вы думаете, что будет передано «для себя»? Должен ли это быть экземпляр bar1 (в этом случае переопределение не требуется)? Или это должна быть строка классов (что тогда будет делать этот код)?

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