我正在为Django REST API实现一个内容感知缓存系统。我想开发一个可以添加到现有视图的组件,它可以通过检查缓存并回退到未命中的基类行为来修改基类的行为。
基本上,我有这样的事情:
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
很明显这不起作用,因为我不知道如何,或者是否可能,或者是否建议从mixin访问兄弟超类。
我的目标是允许我在不触及现有类的内部的情况下向现有视图添加缓存行为的实现。给定一个视图类,C
,s.t。 C.get(request, *args, **kwargs) -> Response
,有没有函数,F
,s.t。 F(C).get(...
在回到C.get
之前进行缓存检查?在这种准形式表示法中,我们会说在类定义中向最左边的父类添加一个mixin算作一个函数。
使用方法装饰器更合适吗?或者类装饰器如何工作?
然后我在研究中看到了__metaclass__
的参考资料,但我不清楚这种方法是什么样的。
这是Python 3.6