Я внедряю систему кэширования с учетом содержимого для API-интерфейса REST Django.Я хотел бы разработать компонент, который может быть добавлен к существующим представлениям, который будет изменять поведение базового класса, проверяя кэш и возвращаясь к поведению базового класса при промахе.
В принципе, у меня есть кое-чтокак это:
class Base:
def get(self, request, *args, **kwargs):
....
return Response
class AnotherBase:
def get(self, request, *args, **kwargs):
....
return Response
class Derived(Base):
pass
class OtherDerived(AnotherBase):
pass
и моей первоначальной мыслью было сделать что-то вроде
class Cacheable:
def get(self, request, *args, **kwargs):
cache_key = self.get_cache_key(request)
base_get = #.... and this is the problem
return cache.get(cache_key, base_get(request, *args, **kwargs))
def get_cache_key(self, request):
# .... do stuff
class Derived(Cacheable, Base):
pass
class AnotherDerived(Cacheable, AnotherBase):
pass
Так что ясно, что это не работает, так как я не знаю, как, илиесли это возможно, или если желательно получить доступ к суперклассу (ам) брата из миксина.
Моя цель - реализация, которая позволяет мне добавлять поведение кэширования к существующим представлениям, не касаясь внутренних элементов существующих классов.Для заданного класса представления C
, st C.get(request, *args, **kwargs) -> Response
, есть ли функция, F
, st F(C).get(...
, проверяет ли кэш, прежде чем вернуться к C.get
?И в этой квазиформальной нотации мы скажем, что добавление миксина к крайнему левому родительскому классу в определении класса считается функцией.
Правильнее ли использовать методы декораторов?или как будет работать декоратор класса?
А потом я видел ссылки на __metaclass__
при исследовании этого, но мне не ясно, как выглядит этот подход.
Это Python 3.6