我正在try 使用神奇的python partialmethod functool.但此分部方法必须引用父类中的函数.

from functools import partialmethod

class MyResource:
    @staticmethod
    def load_resource(id):
        print(f"Loding a new resource ! {id}")
        return MyResource(id)


class CachedDataMixin:
    _cache = {}
    def _get_resource(self, source_cls, id):
        if source_cls not in self._cache or id not in self._cache[source_cls]:
            resource = source_cls.load_resource(id)
            self._cache.setdefault(source_cls, {})[id] = resource
        return self._cache[source_cls][id]

class MyClass(CachedDataMixin):
   _get_my_resource = partialmethod(_get_resource, MyResource)
   def run(self):
       obj1 = _get_my_resource(12345)
       obj2 = _get_my_resource(12345)
       return obj1, obj2

MyClass().run()

当我试图运行这段代码时,我在_get_my_resource = partialmethod(_get_resource, MyResource)上收到一条错误消息NameError: name '_get_resource' is not defined.

我试着用partialmethod(self._get_resource, MyResource)partialmethod(super()._get_resource, MyResource),但都没用.

我找到了一个将_get_resource函数重新定义为MyClass的解决方案,但这个解决方案对我来说似乎很难看:

class MyClass(CachedDataMixin):
    def _wrapped_get_resource(self, source_cls, id):
        return super()._get_resource(source_cls, id)
   _get_my_resource = partialmethod(_wrapped_get_resource, MyResource)
   ...

有没有人有一个很好的解决方案,可以不写我难看的变通方法?

推荐答案

这里有几件事:

  1. 您不能在类中引用CachedDataMixin._get_resource属性,因为它不是在类本身中定义的.MyClass的实例将具有它,但类对象与实例对象不同.
  2. 出于同样的原因,您不能使用self:它仅在方法中定义,并引用实例对象.
  3. super()在从方法调用(并使用实例)时动态工作,因此在类attribute中使用它也不太可能.
  4. 您可以在此处硬编码类名:
  5. 然后,经过如下几次修复:

它最终成功了("加载资源"只有一次,没有错误).

Python相关问答推荐

Python在tuple上操作不会通过整个单词匹配

未删除映射表的行

海运图:调整行和列标签

如果值不存在,列表理解返回列表

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

如何根据一列的值有条件地 Select 前N组?

转换为浮点,pandas字符串列,混合千和十进制分隔符

Polars asof在下一个可用日期加入

Python Pandas—时间序列—时间戳缺失时间精确在00:00

Polars Group by描述扩展

如果包含特定值,则筛选Groupby

SpaCy:Regex模式在基于规则的匹配器中不起作用

查找查找表中存在的列值组合

Django抛出重复的键值违反唯一约束错误

Polars定制函数返回多列

PYTHON中的selenium不会打开 chromium URL

高效地计算数字数组中三行上三个点之间的Angular

Pandas ,快速从词典栏中提取信息到新栏

在Django REST框架中定义的URL获得404分