Class 难以理解类中的私有属性和Python 3中的类属性方法

Class 难以理解类中的私有属性和Python 3中的类属性方法,class,python-3.x,namespaces,decorator,private-members,Class,Python 3.x,Namespaces,Decorator,Private Members,这个班级的例子取自 这里的想法是,当我们创建一个摄氏度实例并设置温度属性(例如foo=Celsus-1000)时,我们希望在设置温度属性之前确保该属性不小于-273 我不明白它是如何绕过self.temperature=temperature直接进入最后一行的。在我看来,这里创建了三个属性:Class属性,temperature;实例属性,温度;以及设置属性_temperature的set_temperature函数 我所理解的是,赋值语句的最后一行必须运行代码propertyget_tempe

这个班级的例子取自

这里的想法是,当我们创建一个摄氏度实例并设置温度属性(例如foo=Celsus-1000)时,我们希望在设置温度属性之前确保该属性不小于-273

我不明白它是如何绕过self.temperature=temperature直接进入最后一行的。在我看来,这里创建了三个属性:Class属性,temperature;实例属性,温度;以及设置属性_temperature的set_temperature函数

我所理解的是,赋值语句的最后一行必须运行代码propertyget_temperature,set_temperature,它运行函数get_temperature和set_temperature,intern设置私有属性/property_temperature

此外,如果我运行:foo=Celsius100,然后运行foo.temperature,那么foo.temperature的结果如何来自于temperature=propertyget\u temperature、set\u temperature以及因此产生的\u temperature而非self.temperature=temperature?为什么还要让self.temperature=temperature如果temperature=propertyget\u temperature,那么每次调用foo.temperature时都会运行set\u temperature

更多问题

为什么我们有两个同名的属性,例如temperature,当调用foo.temperature时,代码如何知道如何检索_temperature的值

为什么我们需要私有属性/属性而不仅仅是温度

set_temperatureself,value如何获得参数值的属性,例如替换值的参数


简而言之,请像一个三岁的孩子一样向我解释这一点,因为我只做了几个月的编程。提前谢谢你

当我们第一次学习类/对象/属性时,我们经常被告知如下内容:

当您查找像x.foo这样的属性时,它首先查看 “foo”是一个实例变量并返回它,如果不是,则检查 “foo”在类x中定义并返回,否则返回 已引发AttributeError

这描述了大部分时间发生的情况,但没有为描述符留出空间。因此,如果您当前认为以上就是关于属性查找属性和其他描述符的全部内容,那么这些规则似乎是个例外

描述符基本上定义了在查找/设置某个实例的属性时要执行的操作,property是一个实现,它允许您在获取/设置/删除属性时定义自己要调用的函数

当您执行temperature=propertyget\u temperature时,设置\u temperature您指定在检索x.temperature时,它应该调用x.get\u temperature,并且该调用的返回值将是x.temperature的计算结果

通过将set_temperature指定为属性的setter,它表示当将ever x.temperature指定给某个对象时,它应该调用set_temperature,并将该值指定为参数


我建议您尝试一下,它将显示在哪些语句之后调用get_temerature和set_temperature的确切时间。

当Celcius.temperature被定义为一个属性时,它将覆盖语句self.temperature=。。。而是调用setter函数set_temperature,这样就不会有名为temperature set的实例变量。它如何知道重写语句self.temperature=temperature?因为它们都有相同的名称,温度?是的,但更具体地说,因为您在类中定义了描述符,当您在实例上使用相同的名称执行任何操作时,描述符将处理实际发生的事情。与方法完全相同,如果运行printself.get\u temperature,它将显示绑定的\u方法对象,而不是函数本身,这是因为函数也是描述符。可能的重复不是重复。我用了一个更真实的例子来说明这些概念。直到你提到它,我才知道描述符是什么。我是一个新手,需要更多的解释给你参考的答案。我也想参考一篇伟大的文章,帮助我了解发生了什么。谢谢
class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

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

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

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

    temperature = property(get_temperature, set_temperature)