我的课程看起来像这样:
@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() 能够FileObject
通过遍历所有 attrs 并仅在实际调用序列化而不是 on 时初始化魔术属性来序列化__init__
。
大多数时候,我真的不希望 Magic 库检查对象,因为它是一项昂贵的 IO 操作。
目标:
a)如何连接两个类
b)只有当我实际调用它时才实例化 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)