了解Python属性工作

时间:2016-12-11 07:35:28

标签: python properties

从其中一个博客中,我有以下代码,我用它来理解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

1 个答案:

答案 0 :(得分:2)

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

可能存在这样的情况:setter已经假设某个值以其他方式存储。不在这里,但是例如只有在self._temperature增加时才应设置hasattr(self, "_temperature")。在这种情况下,您必须直接访问该属性。 (通过使用setter和getter中的 self.temperature = some_value 测试“存储”属性并进行适当初始化,可以避免这种情况。

控制权永远不会出现在设定者身上。如果你这样做,就会使用setter:

self._temperate

您始终可以直接从任何其他方法设置“隐藏”属性(在本例中为Celsius)(或直接访问update table_name set cod_user = CASE WHEN user_rol = 'student' THEN '622057' WHEN user_rol = 'assistant' THEN '2913659' WHEN user_rol = 'admin' THEN '6160230'? END,date = '12082014' WHERE user_rol IN ('student','assistant','admin') AND cod_office = '17389551'; 实例上的属性)。请注意,这恰好是之前带有下划线的属性名称,它可以是任何(免费)名称。