温度换算成华氏度(温度换算成华氏度计算器)

您将了解Python中的@property特性,并以Python的方式使用getter和setter。目录先举个例子。使用Getter和Setter@财产的力量

您将了解Python中的@property特性,并以Python的方式使用getter和setter。

温度换算成华氏度(温度换算成华氏度计算器)插图

目录

先举个例子。

使用Getter和Setter

@财产的力量

深刻理解财产。

Python有一个很棒的概念叫property,让面向对象程序员的生活更简单。

在定义和研究@property是什么之前,我们先来直观感受一下为什么要用它。

先举个例子。

假设您决定创建一个以摄氏度存储温度的类[1],它还将实现一个将温度转换为华氏度的方法。一种方法是这样做。

我们可以使用这个类来创建对象,并按照我们的意愿操作它的属性temperature。您可以在Python shell上尝试这些操作。

转换为华氏时,由于浮点运算错误,小数点增加一位(请尝试Python解释器中的1.1+2.2)。

当我们分配或检索任何像温度这样的对象属性时,如上所示,Python将在该对象的__dict__字典中搜索它。

因此,人。温度将成为人。__dict__['temperature']。

现在,让我们进一步假设我们的类在客户中非常受欢迎,他们开始在自己的程序中使用它。他们对这个物体做了各种赋值操作。

有一天,一个信任的客户来找我们,建议温度不能低于-273摄氏度(热力学的同学可能会说实际上是-273.15摄氏度),也就是俗称的绝对零度。他还要求我们实现这个值约束。作为一个追求客户满意度的公司,我们很高兴采纳这个建议并发布1.01版本(升级现有的类)。

使用Getter和Setter

约束上述值的一个显而易见的解决方案是隐藏属性temperature(使其私有)并定义新的getter和setter接口来操作它。你可以这样做。

从上面可以看出,我们定义了两个新方法,get_temperature和set_temperature,并用_temperature代替了temperature。在Python中,开头的下划线(_)用来表示私有变量。

此更新成功实现了新的限制。我们不能把温度设在零下273度以下。

注意,Python中没有私有变量,但是有一些简单的准则可以遵循。Python本身没有限制。

但这不是大问题。上面更新的一个很大的问题是,所有在程序中实现我们之前的类的客户都要修改自己的代码,把obj.temperature改成obj.get_temperature,把所有像obj.temperature = val这样的赋值语句改成obj.set_temperature(val)。

这种重构可能会给客户带来几十万行代码的麻烦。

简而言之,我们的新更新不是向后兼容的。这时候财产就派上用场了。

@财产的力量

Pythonic处理上述问题的方法是使用property。下面是我们实现它的方法。

然后,在shell中运行下面的代码并观察。

我们添加了一个打印函数来获取_temperature和set_temperature,以便清楚地观察它们是否正在被执行。

代码的最后一行创建了一个属性对象temperature。简单来说,property将一些代码(get_temperature和set_temperature)附加到成员属性access (temperature)上。

任何检索温度值的代码都会自动调用get_temperature,而不是使用字典(__dict__)来查找。类似地,任何给温度赋值的代码都会自动调用set_temperature。这是Python中一个很酷的特性。

我们可以看到,上面的set_temperature即使在创建对象的时候也被调用。

你能猜到原因吗?

原因是在创建对象时调用了__init__方法。这个方法的代码是self.temperature = temperature,所以在赋值的时候会自动调用set_temperature。

同样,任何访问,比如c.temperature,都会自动调用get_temperature。财产就是干这个的。这里还有几个例子。

通过使用property,我们可以看到我们已经修改了类并实现了对值的约束,而没有对客户代码进行任何更改。所以我们的实现是向后兼容的,大家都开心。

最后请注意,实际温度值存储在私有变量_temperature中。属性temperature是一个为这个私有变量提供接口的属性对象。

深刻理解财产。

在Python中,property是一个内置函数,用于创建和返回属性对象。这个函数的特征是:

其中,fget是获取属性值的函数,fset是设置属性值的函数,fdel是删除属性的函数,doc是字符串(像注释)。从上面的实现可以看出,这些函数参数是可选的。因此,您可以创建一个属性对象,如下所示。

属性有三个方法,getter、setter和deleter,用于以后指定fget、fset和fdel。这意味着这行代码

可以分解成

这两段代码是等价的。

熟悉Python中的decorator [2]的程序员可能会意识到,上述构造可以作为decorator来实现。

我们可以继续,不定义get_temperature和set_temperature名称,因为它们是不必要的,会污染类命名空。因此,在定义getter和setter函数时,我们重用了temperature这个名称。这是如何实现的。

上面的实现是创建属性的简单且推荐的方法。当您在Python中寻找属性时,您可能会遇到这些类型的构造。

好了,今天就到这里。

相关链接:

[1]——

[2]——

英文原文: 译者:野生大熊猫

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/137223.html

发表回复

登录后才能评论