如何解决如果您不介意使用方法访问属性,是否值得使用 Python 的 @property 装饰器?
更新:
感谢您的回复。我认为它现在终于让我想起了事情。
Python 规定了这个工作流程:
- 从仅使用属性开始,避免使用样板 getter/setter 进行过度设计
- 当需要更多逻辑时,使用
@property
装饰器切换到 getter/setter 以维护一致的 API 以减少重构
与这些工作流程相反:
- 开始使用 getter/setter 以避免以后重构。
- 这会添加可能永远不需要的不必要的样板代码
或
- 开始使用属性
- 在需要更多逻辑时切换到非
@property
getter/setter - 重构所有依赖代码以使用 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
装饰器纯粹是为了让类界面更美观吗?
我确实认为界面最终看起来更好,但我想知道我是否缺少更多东西。
感谢您的时间:)
解决方法
我会发布一个答案来关闭这个帖子,因为评论者看起来很忙:
Python 规定了这个工作流程:
- 从仅使用属性开始,避免使用样板 getter/setter 进行过度设计
- 当需要更多逻辑时,使用
@property
装饰器切换到 getter/setter 以维护一致的 API 以减少重构
与这些工作流程相反:
- 开始使用 getter/setter 以避免以后重构。
- 这会添加可能永远不需要的不必要的样板代码
或
- 开始使用属性
- 需要更多逻辑时切换到非@property getter/setter
- 重构所有依赖代码以使用 getter/setter 而不是属性
我希望这有助于其他人更好地理解 Python 规定使用 @property
的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。