gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:01:54 25 4
gpt4 key购买 nike

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

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 方法一样重构类似属性的接口(interface)背后的 getter 逻辑是很有用的。

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

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

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

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)

是因为它让 setter 更漂亮吗?所以代替:
klass.set_value('一些值')
你可以拥有吗?:
klass.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 装饰器的原因是否纯粹是为了让类接口(interface)更美观?

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

感谢您的宝贵时间:)

最佳答案

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

Python 规定了这个工作流程:

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

与这些工作流程相反:

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

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

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

关于python - 如果您不介意使用方法访问属性,是否值得使用 Python 的 @property 装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67089941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com