如果您不介意使用方法访问属性,那么使用Python的@property decorator是否值得?

2024-03-29 01:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

更新:
谢谢你的回复。我想它最终帮助我的头脑中的东西点击现在

Python规定了此工作流:

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

与这些工作流相反:

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

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

再次感谢您帮助我了解这些事件的时间轴以及@property的巨大用处

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

原件:

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

我理解,允许库用户获取class.property之类的属性,同时允许库维护人员重构类属性接口背后的getter逻辑非常有用,就像getter方法一样

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

有什么我遗漏的吗?我不明白为什么方法调用中的额外括号有问题,足以保证使用decorator

也许下面的代码可以帮助解释我想做得更好的原因:

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装饰器的原因纯粹是为了使类接口更美观吗

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

感谢您抽出时间:)


Tags: 代码selfreturn属性initvaluedef装饰
1条回答
网友
1楼 · 发布于 2024-03-29 01:33:22

我将发布一个答案来结束这篇文章,因为评论者似乎很忙:

Python规定了此工作流:

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

与这些工作流相反:

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

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

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

相关问题 更多 >