Я хотел бы создать дочерний класс, который имеет метод родительского класса, где метод является «методом класса» в дочернем классе, но нет в родительском классе.
По сути, я пытаюсь выполнить следующее:
class foo(Object):
def meth1(self, val):
self.value = val
class bar(foo):
meth1 = classmethod(foo.meth1)






Что вы пытаетесь достичь? Если бы я увидел такую конструкцию в живом коде 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 (в этом случае переопределение не требовалось)? Или это должна быть панель класса (что тогда будет делать этот код)?