下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >编程语言 >Python 中的 property 属性 (1)

Python 中的 property 属性 (1)

希尔瓦娜斯发布于 2018-03-21 09:25查看:892回复:2

Python中有个很赞的概念,叫做property,它使得面向对象的编程更加简单。在详细解释和深入了解Python中的property之前,让我们首先建立这样一个直觉:为什么我们需要用到property?

从一个实例开始

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

image.png

我们可以用这个类产生一个对象,然后按照我们期望的方式改变该对象的温度属性:

image.png
这里额外的小数部分是转换成华氏温度时由于浮点运算误差造成的(你可以在Python解释器中试试1.1 + 2.2)。每当我们赋值或获取任何对象的属性时,例如上面展示的温度,Python都会从对象的__dict__字典中搜索它。

image.png


因此,man.temperature在其内部就变成了man.__dict__['temperature']

现在,让我们进一步假设我们的类在客户中很受欢迎,他们开始在其程序中使用这个类。他们对该类生成的对象做了各种操作。有一天,一个受信任的客户来找我们,建议温度不能低于-273摄氏度(热力学的同学可能会提出异议,它实际上是-273.15),也被称为绝对零。客户进一步要求我们实现这个值约束。作为一个以争取客户满意度为己任的公司,我们很高兴地听从了建议,发布了1.01版本,升级了我们现有的类。

使用Getters和Setters

对于上边的约束,一个很容易想到的解决方案是隐藏其温度属性(使其私有化),并且定义新的用于操作温度属性的getter和setter接口。可以这么实现:

image.png


从上边可以看出,我们定义了两个新方法get_temperature()set_temperature(),此外属性temperature也被替换为了_temperature。最前边的下划线(_)用于指示Python中的私有变量。

image.png

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

请注意,Python中实际上是没有私有变量的。有一些简单的被遵循的规范。Python本身不会应用任何限制。

image.png

但这样并不会让人很放心。上述更新的最大问题是,所有在他们的程序中使用了我们先前类的客户都必须更改他们的代码:obj.temperature改为obj.get_temperature(),所有的赋值语句也必须更改,比如obj.temperature = val改为obj.set_temperature(val)。这样的重构会给那些拥有成千上万行代码的客户带来很大的麻烦。

总而言之,我们的更新是不向后兼容地。这就是需要property闪亮登场的地方。

收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享

版主推荐

    共有2条评论

    • IT宅男
    • mr jack
    • Mr ken
    • Mright
    • cappuccino
    • YUI
    • 课课家运营团队
    • 课课家技术团队1
    • 酸酸~甜甜
    • 选择版块:

    • 标题:

    • 内容

    • 验证码:

    • 标题:

    • 内容

    • 选择版块:

    移动帖子x

    移动到: