Украшение метода родительского класса

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

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

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

class bar(foo):
    meth1 = classmethod(foo.meth1)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
886
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Ответ принят как подходящий

Я также не совсем уверен, какое именно поведение вы хотите, но предполагая, что вы хотите, чтобы 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 уже преобразован в метод со специальным значением для первого параметра. Вам нужно отменить это и посмотреть на базовый объект функции, переосмыслив, что означает «я».

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

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

Нормальный метод - это более или менее просто функция, которая принимает в качестве своего первого аргумента (обычно называемого «self») экземпляр класса и вызывается как «.».

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

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

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

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

Другие вопросы по теме