首页 > 解决方案 > 如何将此 getter/setter 代码包装在装饰器中?

问题描述

我正在为二进制文件格式制作解析器,大量代码只是属性获取器/设置器。setter 逻辑有时会发生变化,但它只是验证部分。

以下是它的示例:

class A(Base):
    @property
    def name(self) -> Optional[str]:
        return getattr(self, '_name', None)
    
    @name.setter
    def name(self, value: str):
        # There might be some validation here, mostly an assert
        self.setprop('name', value)

wheresetprop()是一个继承的方法,它也减少了样板文件

或者

class B(Base):
    @property
    def index(self) -> Optional[int]:
        return getattr(self, '_index', None)
    
    @index.setter
    def index(self, value: int):
        # There might be some validation here, mostly an assert
        self._stream.seek(pos)    # pos is different for every property
        self._stream.write_uint16(value)
        self._index = value

由于格式的工作方式,我不能每次都使用第一种设置方法。我想为这段代码使用装饰器,这样它看起来干净整洁并减少了错误。我想让属性设置器看起来像这样:

@property_setter('index', seek=pos, type=Types.UInt16)
def index(self, value: int):
    # Validation, THIS MUST HAPPEN BEFORE property_setter code
    pass

标签: pythonpropertiespython-decorators

解决方案


推荐阅读