Python декорирование классов и сохранение имени - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь создать декоратор для классов, который принимает parent_klass в качестве аргумента и модифицирует исходный класс, наследуя parent_klass и возвращает его. Ниже приведена реализация этой идеи:

class HelperClass:
    def helper_method(self):
        print("helper method...")


def inherit_from(parent_klass):

    def wrapper(cls):
        class DecoratedClass(cls, parent_klass):
            pass
        return DecoratedClass

    return wrapper


@inherit_from(HelperClass)
class Foo:
    pass


f = Foo()
f.helper_method()  # prints helper method...
print(Foo.__name__)  # prints DecoratedClass

Вышеупомянутый код работает, как я ожидал, за исключением последней строки print. Моя проблема в том, что __name__ атрибут исходного класса (Foo) не сохраняется и заменяется на DecoratedClass. Как я могу применить functools.wraps функциональность в этом случае? Есть ли другой способ, кроме использования функции wraps?

EDIT: На самом деле, я хочу использовать это украшение в проекте Django, в котором атрибут __name__ важен для базы данных отображение. Этот декоратор предназначен для генерации динамических c моделей, которые также содержат собственные менеджеры. Простое наследование класса без декоратора не решает мою проблему, поскольку предоставленный аргумент (в данном случае «parent_klass», но класс «custom queryset» в реальной реализации) также используется в методах базового класса (Foo).

...