我有这样的类:
@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.