Я пытаюсь создать декоратор для классов, который принимает 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
).