Python mixin / decorator / __ metaclass__用于基类增强

问题描述 投票:1回答:3

我正在为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

python django metaprogramming multiple-inheritance python-decorators
3个回答
© www.soinside.com 2019 - 2024. All rights reserved.