如果您不介意使用方法访问 属性,是否值得使用 Python 的 @属性 装饰器?

Is it worth using Python's @property decorator if you don't mind using a method to access a property?

更新:
感谢您的回复。我认为它终于让我的脑子里的事情变得清晰起来。

Python 规定了这个工作流程:

  1. 从仅使用属性开始,避免使用样板进行过度设计 getter/setter
  2. 当需要更多逻辑时,使用 @property 装饰器切换到 getter/setter 以保持一致 API 以减少重构

反对这些工作流程:

  1. 开始使用 getter/setter 以避免以后重构。
    • 这会添加可能永远不需要的不必要的样板代码

  1. 开始使用属性
  2. 当需要更多逻辑时切换到非@property getter/setter
  3. 重构所有依赖代码以使用 getter/setter 而不是属性

再次感谢您帮助我理解这些事件的时间表以及 @property 的强大用途。

如果你们中的任何一个想添加一个答案,我会接受它以结束这个。 再次感谢

原文:

我一直在阅读 Python 的 @property 装饰器。

我理解允许库用户获得类似 class.property 的属性,同时允许库维护者重构 属性 类接口背后的 getter 逻辑非常有用getter 方法。

我不明白的是,为什么要费力地使用装饰器来实现一个类似于 属性、class.property 的界面。像接口这样的普通方法有什么问题,比如 class.property()?

有什么我想念的吗?我不明白为什么方法调用中的额外括号有问题以至于需要使用装饰器?

也许下面的代码可以帮助解释我想要做得更好的东西?:

class Class:
    def __init__(self, value):
        self._value = value

    def value(self):
        return self._value

print(Class('calling method').value())

class Class:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        return self._value

print(Class('accessing property').value)

是因为它让二传手更漂亮吗? 所以代替:
klass.set_value('some value')
你可以拥有吗?:
klass.value = 'some value'

喜欢这个示例代码吗?:

class Class:
    def __init__(self, value):
        self._value = value

    def value(self):
        return self._value

    def set_value(self, value):
        self._value = value

klass = Class('calling method')
klass.set_value('calling method2')
print(klass.value())

class Class:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = value

klass = Class('accessing property')
klass.value = 'accessing property2'
print(klass.value)

使用 @property 装饰器的原因是否纯粹是为了使 class 界面更美观?

我确实认为界面最终看起来更好,但我想知道我是否遗漏了更多内容。

感谢您的宝贵时间:)

我只是 post 一个答案来结束这个话题,因为评论者看起来很忙:

Python 规定了这个工作流程:

  1. 从仅使用属性开始,避免使用样板进行过度设计 getter/setter
  2. 当需要更多逻辑时,使用 @property 装饰器切换到 getter/setter 以保持一致 API 以减少重构

反对这些工作流程:

  1. 开始使用 getter/setter 以避免以后重构。
    • 这会添加可能永远不需要的不必要的样板代码

  1. 开始使用属性
  2. 当需要更多逻辑时切换到非@属性getter/setter
  3. 重构所有依赖代码以使用 getter/setter 而不是属性

我希望这可以帮助其他人更好地理解 Python 规定使用 @property 的原因。