【问题标题】:Understanding Python property working了解 Python 属性的工作原理
【发布时间】:2016-12-11 07:35:27
【问题描述】:

在其中一篇博客中,我有以下代码,我用它来了解 python property 的工作原理。

class Celsius:
    def __init__(self, temperature = 0):
        self._temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32

    @property
    def temperature(self):
        print("Getting value")
        return self._temperature

    @temperature.setter
    def temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        print("Setting value")
        self._temperature = value

Q1:__init__方法下,作者为什么用self._temperature。不应该是self.temperature吗?控件将如何转到@temperature.setter

【问题讨论】:

  • 我希望你在python 3下运行这个,在python 2上你需要从object继承你的类。
  • "控制权如何转到@temperature.setter?" - 它不会。

标签: python properties


【解决方案1】:

__init__() 中使用self._temperature 是否正确有时是一个品味问题。本质上,现在有第三种方法(除了settergetter)知道存储实际值的属性。 IMO 不好,如果重构类并更改属性可能会导致错误,但它本身并不错误。

在某些情况下,setter 已经假定某个值以其他方式存储。不在这里,但例如当 self._temperature 仅在增加时才应设置。在这种情况下,您必须直接访问该属性。 (可以通过在 setter 和 getter 中使用 hasattr(self, "_temperature") 测试“存储”属性的存在并适当地初始化来规避这种情况)。

控制权永远不会交给二传手。如果你这样做,setter 就会被使用:

 self.temperature = some_value

您始终可以从任何其他方法(或直接访问Celsius 实例上的属性)直接设置“隐藏”属性(在本例中为self._temperate)。请注意,这恰好是带有下划线的属性名称,它可以是任何(免费)名称。

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 2016-04-10
    • 2016-02-20
    • 2012-12-11
    • 2011-02-18
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多