Python有一个很酷的概念,叫物业,面向对象编程更容易。之前在属性详细和深入的Python解释的理解,让我们先来建立这样一种直觉:为什么我们需要使用属性?

从一开始的一个例子

假设有一天你决定创建一个用来存储摄氏度类。当然,这还需要实现一个类来摄氏度转换为华氏方法。的方式来实现以下目标:

我们可以用这个类来生成一个对象,然后改变按照所期望的行为的对象的温度特性:

当有转换成浮点错误额外华氏的小数部分造成的,因为(1你可以尝试Python解释器。1 + 2.2)。每当我们得到如上图所示的分配或对象的任何属性,如温度,Python将搜索它从字典对象。

因此,人。温度内部变成

现在,让我们进一步假设我们的类是很受客户,他们开始在其方案中使用这个类。他们做各种操作所生成的目标类。有一天,一个值得信赖的客户到我们这里来,-273摄氏度的温度不低于推荐(学生热力学可能受到挑战,它实际上是-273.15),也被称为绝对零度。客户要求我们进一步实现价值约束。与客户满意度责任公司,我们乐意听取意见,发布了1.01版,升级我们现有的类。

使用getter和setter

对于上界,而且它很容易想到的溶液是隐藏其温度特性(它私有化),以及用于操作温度定义界面的新的getter和setter属性。它可以实现:

正如从上面可以看出,我们定义了两个新的方法,此外还更换温度特性。下划线(_)的最前方是用来表示在Python私有变量。

此更新成功地实现了新的约束,我们不再允许设置低于-273度的温度。

请注意,Python是居然没私有变量。有一些简单的遵循规范。Python本身并不适用任何限制。

但是,这并不让人感到舒适。最大的更新问题是,使用他们的节目中我们前面的类所有客户必须改变他们的代码:OBJ。温度变化OBJ。get_temperature(),所有分配也必须改变,如OBJ。温度= VAL到OBJ。set_temperature(VAL)。这样的重建会给这些客户与成千上万的代码带来很大的麻烦线。

总而言之,我们是不是向后兼容的更新。这是首次亮相财产需要的地方。

物业角色

有关的最常见问题,Python风格的解决方案是使用属性。在这里,我们已经实现了一个版本:

我们增加了一个print()函数和内部,清楚地看到,如果他们正在执行。的最后一行代码创建一个属性目标温度。简单地说,物业将参观一些代码(和)连接到成员属性(温度)入口。任何得到的代码的温度值将被自动调用,而不是到词典表()以找到。同样,任何代码分配温度值会自动调用。这是Python中一个很酷的功能。我们为您显示实际。

我们可以从上面的代码中看到,甚至当我们创建一个对象,将被称为。为什么你猜?其原因是,在创建对象时,该方法被称为。该方法具有线代码自。温度=温度。这个任务会自动调用该方法。

类似地,对于任何访问属性,如c。温度,会自动调用方法。这是什么原因使财产。这里有一些额外的例子。

接下来,我们可以看到,通过使用属性,我们并不需要在客户端代码进行修改,我们班任何改变,并实现了克制的价值。因此,我们的实现是向后兼容的,这样的结果,我们感到非常高兴。

最后,应该指出的是,实际温度值存储在私有变量。特性温度是用于提供私有变量的接口的属性的对象。

挖财产

在Python,财产()是一个内置函数来创建并返回一个属性的对象。该函数的签名是:

这里,fget是获取属性值的函数,FSET属性值是设定的函数,FDEL属性是一个删除功能,文档是一个字符串(类似的评论)。从视功能的实现点,这些参数是可选。所以,你可以简单地通过以下方式创建一个对象的属性。

属性对象有三种方法,吸气剂(),二传()和delete(),用于设置fget创建对象后,FSET和FDEL。这意味着,这行代码:温度=属性(get_temperature,set_temperature)可以如下分解:

他们彼此相等。

Python是熟悉的装饰的装饰程序员可以识别上述结构可以作为一个装饰来实现。我们可以走得更远,而不是定义名称get_temperature和set_temperature,因为他们是没有必要的,而且污染类的命名空间。为此,我们定义getter和setter函数时重用温度函数的名称。下面的代码演示如何实现。

上面两种方法生成执行财产,很简单,建议使用。当Python找物业,你很可能会遇到这样类似的代码结构。

我支持奖励翻译更多的好文章,谢谢!


本文链接:Python 中的 property 属性

您可能也会喜欢

友情链接:

经文 大悲咒注音 心经唱诵