Динамическое добавление атрибута в класс 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}')

Подскажите, как это сделать нормально, чтобы без дорогих костылей. Заранее спасибо


Ответы (0 шт):