Код: Выделить всё
from typing import Type, TypeVar
T = TypeVar("T")
class NewMethodsMixin:
def new_method(self) -> str:
"""This is a new method added by a mixin."""
print("added by mixin")
def class_decorator(cls: Type[T]):
class Decorated(NewMethodsMixin, cls):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
cls.__init__(self, *args, **kwargs)
return Decorated
@class_decorator
class MyClass:
def old_method(self) -> str:
print("original method")
my_instance = MyClass()
my_instance.old_method() # 'original method'
my_instance.new_method() # 'added by mixin'
1
Я хочу получить подсказки по типам для old_method.
А если я использую другой подход:
Код: Выделить всё
...
def class_decorator(cls: Type[T]) -> Type[T]:
...
2
Теперь я получаю подсказку типа для old_method, но потеряю подсказку типа для new_method.
Если я использую Union:
Код: Выделить всё
...
def class_decorator(cls: Type[T]) -> Type[T] | Type[NewMethodsMixin]:
...
3
Видимо, pylance или другие подсказки типов может правильно обработать декорированный класс, но если я унаследую новый класс, это приведет к сбою.
По некоторым причинам я предпочитаю использовать декораторы вместо использования наследования классов, поскольку мои пользователи могут этого не делать. уметь решать проблему множественного наследования. Есть ли здесь какое-нибудь решение?
Подробнее здесь: https://stackoverflow.com/questions/793 ... -a-class-d