Python attrs类属性缓存延迟加载

我有这样的类:

@attr.s
class ImageMagic(object):
    path = attr.ib()

    _img = attr.ib()

    @_img.default
    def _img(self):
        return Image.open(self.path)

@attr.s
class FileObject(object):
    # Standard
    path = attr.ib()

    # When magic-ed
    magic = attr.ib(default=None)

我的目标是让attrs.asdict()能够通过遍历所有attrs并仅在实际上被要求进行序列化而不是在__init__上初始化magic属性时才能对FileObject进行序列化.

大多数时候,我真的不希望Magic库检查对象,因为它是昂贵的IO操作.

目标:
a)如何连接两个类

b)具有magic属性只能在我实际调用它时实例化ImageMagic对象.

c)仅一次,以便以后多次调用时可以重用.

有了这个,我宁愿使用Attrs库.

一般不干净的解决方案是使用@property和getter,getter检查私有_magic属性的存在,如果不存在,则进行加载.

然后以某种方式将属性注册到attrs库,以便进一步对其进行序列化.

这是一个实际解决方案的示例:

@attr.s
class IOExpensiveClass(object):
    path = attr.ib()

    _hash = attr.ib()

    @_hash.default
    def _img(self):
        return IOOPERATION(self.path)


@attr.s
class FileObject(object):
    # Standard
    path = attr.ib()

    _magic = None

    # Missing attrs registration,that I yet don't know how to write
    @property
    def magic(self):
        return self._magic or IOExpensiveClass(self.path)

最佳答案
退后一步时的问题是序列化之一. Python的延迟加载方式确实是使用属性,因此您可以正确地做到这一点.

序列化(以及反序列化更是如此)的问题在这里和attrs错误跟踪器上都经常出现.问题在于,这是一个固有的复杂主题,这就是为什么我们决定在某些时候将其排除在范围之外,除非是简单的案例(即直接算词/阿斯普鲁特),而是让社区提出专门的库.

确实,您可以在attrs wiki中找到一堆用于[sd]序列化的库,但是我不知道它们中的任何一个是否都支持您的有效但前卫的用例.

也就是说,如果两者都不能满足您的需求,则可以使用attrs的extension machinery和元数据完全实现您的用例.我不确定您是否可以按自己的意愿执行命令,但是在最坏的情况下,您可以复制/粘贴并添加自己的逻辑.功能is quite simple.

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...