Динамическое добавление атрибута в класс setattr()
Легенда: Тренирую рыцарей. Класс:
class Knight:
def __init__(self, color, horse):
self.color = color
self.horse = horse
Рыцари умеют только ничего не делать:
def unknown_method(self, *args, redirect=False):
if redirect:
print(f'Some unknown method with name={args[0]} and args={args[1:]}')
else:
print(f'Usual unknown method and args={args}')
Создаю двух рыцарей:
knight = Knight('black', 'black and white')
knight2 = Knight('white', 'purple')
Если свежих рыцарей попросить сделать "то - не знаю что" (unknown_method (выше)), все по плану:
knight.unknown_method(4, 6)
knight.unknown_method(4, 8, 'стопиццот')
Для неизвестных изначально методов у них есть тренировка. Примерно:
def __getattr__(self, method):
def wrapper(*args):
print(f'NAME OF NEW ATTR: {method}')
self.unknown_method(method, *args, redirect=True)
if method in self.__dict__: # сюда мы не попадаем,
print("YES", method) # так как __getattr__ раньше найдет
return method # уже существующий метод
else:
# А вот здесь нужно добавление метода(атрибута) не объекту
#класса (одному рыцарю)Б а всему классу:
setattr(self, method, lambda *args: print(f'Already added method {method} with args={args}'))
return wrapper
Нужно что-то вроде:
setattr(self.__class__, method, lambda *args: print(f'Already added method {method} with args={args}')
Подскажите, как это сделать нормально, чтобы без дорогих костылей. Заранее спасибо