Python 属性 外部定义的对象 class __init__

Python property object defined outside class __init__

我一直在阅读 Python 属性的 Python 教程,但我无法理解这段代码:

# using property class
class Celsius:
    def __init__(self, temperature=0):
        self.temperature = temperature

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

    # getter
    def get_temperature(self):
        print("Getting value...")
        return self._temperature

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

    # creating a property object
    temperature = property(get_temperature, set_temperature)


human = Celsius(37)

print(human.temperature)

print(human.to_fahrenheit())

human.temperature = -300
  1. 为什么 属性 在 init 之外赋值?
  2. self._temperature 在哪里定义的?
  3. 即使这两者在代码中的任何地方都没有链接在一起,self._temperature 又如何链接到 self.temperature
  4. 为什么在 to_fahrenheit 函数中,即使我正在更改 self.temperature,但更改的是 self._temperature 而不是原来的 temperature在构造函数中定义?

非常感谢任何帮助,因为这没有任何意义但有效!

您的代码片段说明了 getter and setter methods in Python 的概念。当试图设置 temperature class 变量(例如 human.temperature = -300)时,Python 实际上并没有修改 human.temperature,而是调用 human.set_temperature(-300),这,如果没有出现错误,则将 human._temperature 设置为指定值。同样,调用 print(human.temperature) 等同于 print(human.get_temperature())(在您的代码中尝试这些替换,看看会发生什么)。

此外,_temperature_ 前缀表明它是 private variable,即不应在 class 定义和 get_ / set_ 前缀声明函数是 getter / setter.

总之,human.temperature 不保存值,而是根据上下文调用 human.get_temperature()human.set_temperature()。实际值存储在 human._temperature 中。更详细的解释,我建议阅读上述文章。