导语

在Java中,通常在类中定义的成员变量为私有变量,在类的实例中不能直接通过对象.属性直接操作,而是要通过getter和setter来操作私有变量。

而在Python中,因为有property这个概念,所以不需要写getter和setter一堆重复的代码来操作私有变量。Python“私有变量”通常在变量前加上“_”或者“__”,例如_attr或者__attr,这是约定俗成的规范。

把私有属性变成只读特性

class MyClass:

    def __init__(self, x):
self._x = x

这里定义了一个MyClass类,它有一个实例变量_x,绑定了用户传来的x值。_x是私有变量,通过obj._x获取私有变量不符合语言规范,进而我们要使_x变成property(特性),通过obj.x直接访问。

改造后的代码如下:

class MyClass:

    def __init__(self, x):
self._x = x @property
def x(self):
return self._x >>> obj = MyClass(10)
>>> obj.x
10

我们把_x变成了property特性,以只读的方式获取x的值。

我们现在想为x赋值该怎样做呢?

>>> obj.x = 999
Traceback (most recent call last):
File "xxx", line 14, in <module>
obj.x = 23
AttributeError: can't set attribute

可以看到,抛出了AttributeError: can't set attribute。显然,只读方法不支持赋值。

把私有变量变成可赋值的特性

我们只需要在上述代码改造成:

class MyClass:

    def __init__(self, x):
self._x = x @property
def x(self):
return self._x @x.setter
def x(self, value):
self._x = value >>> obj = MyClass(10)
>>> obj.x = 999
>>> obj.x
999

可以看到,我们为x添加了setter,可以直接为obj.x赋值操作

property属性能够遮盖实例属性

继续上面的代码,我们看看以下的操作:

>>> obj = MyClass(10)
>>> obj.__dict__
{'_x': 999} #此时实例变量中有_x的值
>>> obj.__dict__['x'] = 99999 #设置obj的实例变量有x值,跟property属性重名!
>>> obj.__dict__
{'_x': 999, 'x': 99999} #此时实例变量中有_x和x的值 >>> obj.x #结果是obj的实例变量还是property属性?
10

如上代码所示,obj对象有一个_x实例变量和一个x的property属性,我们又强行为obj增加了一个x实例变量,这个实例变量x和property属性x同名!

通过obj.x我们得知,返回的是property属性,说明property属性会遮盖实例属性!也可以理解为property属性的优先级更大!

property类解析

我们通常使用内置的@property装饰器。但其实property是一个类,python中类和函数的调用方式都差不多,他们都是可调用对象

property的构造方法如下:

class property(object):
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
""""""

它最大接受4个参数,都可以为空。

第一个为getter,第二个为setter,第三个为delete函数,第四个为文档。

上述代码的另一种写法

class MyClass:

    def __init__(self, x):
self._x = x def get_x(self):
return self._x def set_x(self, value):
self._x = value x = property(get_x, set_x) >>> obj = MyClass(10)
>>> obj.x
10

如上,x是property的实例,设置了getter和setter,作为类变量放在MyClass类中。

以上就是property属性的解析。

Python深入浅出property特性属性的更多相关文章

  1. python 使用@property 操作属性时,报“RecursionError:maximun recursion depth exceeded”

    使用@property获取和修改属性,出现报错"RecursionError:maximun recursion depth exceeded",超过了最大的递归深度 原因: 方法 ...

  2. python的property属性

    最近看书中关于Python的property()内建函数属性内容时<python核心编程>解释的生僻难懂,但在网上看到了一篇关于property属性非常好的译文介绍. http://pyt ...

  3. Property - 特性(Python)

    Property - Python 特性 不同的书籍对 property 一词的翻译有所不同, 我们将 property 翻译成 '特性' 以区别于 attribute 一词. 先看看 propert ...

  4. python对象属性管理(2):property管理属性

    使用Property管理属性 python提供了一种友好的getter.setter.deleter类方法的属性管理工具:property. property()是一个内置函数,它返回一个Proper ...

  5. python 中 property 属性的讲解及应用

    Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 1. 装饰器 即:在方法上应用装饰器 2. 类属性 即 ...

  6. 【转】python之property属性

    1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ############### class Foo: def ...

  7. python中property属性的介绍及其应用

    Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...

  8. 第7.23节 Python使用property函数定义属性简化属性访问的代码实现

    第7.23节 Python使用property函数定义属性简化属性访问的代码实现 一.    背景       在本章前面章节中,我们介绍了类相关的知识,并举例进行了说明,在这些例子中会定义一些形如 ...

  9. Python使用property函数定义的属性名与其他实例变量重名会怎么样?

    首先如果定义的属性名与该属性对应的操作方法操作的实例对象同名就会触发无穷的递归调用,相关部分请参考<Python案例详解:使用property函数定义与实例变量同名的属性会怎样?> 但如果 ...

随机推荐

  1. 系统安全-Man in the middleattack

    窃听VS加密(解决数据机密性) 加密由两部分组成:算法&秘钥(算法要够复杂,秘钥要够安全) 对称加密:(Symmetric encryption) 采用单秘钥密码系统的加密方法,同一个秘钥可以 ...

  2. python3短信接口使用

    import http.client from urllib import parse host = "106.ihuyi.com" sms_send_uri = "/w ...

  3. caffe搭建----Visual Studio 2015+CUDA8.0+CUDNN5配置Caffe-windows(BLVC)

    原文来源:  来源:Angle_Cal  2016-12-19 17:32 本博主修改于2017-09-12.  版权所有,转载请注明出处.   BLVC版本的Caffe-windows已经支持Vis ...

  4. Matlab中图片保存的四种方法

    matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的.Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工具箱 ...

  5. iOS开发 - UIViewController控制器管理

    创建一个控制器 控制器常见的创建方式有下面几种 //通过storyboard创建 //直接创建 ViewController *vc = [[ViewController alloc] init]; ...

  6. 几个经典的TCP通信函数

    前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明. socket函数 函数作用:创建一个网际字节流套接字 包含头文件 ...

  7. LeetCode(155)题解--Min Stack

    https://leetcode.com/problems/min-stack/ 题目: Design a stack that supports push, pop, top, and retrie ...

  8. 使用UIWebView载入本地或远程server上的网页

    大家都知道,使用UIWebView载入本地或远程server上的网页,sdk提供了三个载入接口: - (void)loadRequest:(NSURLRequest *)request; - (voi ...

  9. Bubble Cup X - Finals [Online Mirror] B. Neural Network country 矩阵快速幂加速转移

    B. Neural Network country time limit per test 2 seconds memory limit per test 256 megabytes Due to t ...

  10. 1069: [SCOI2007]最大土地面积

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2961  Solved: 1162[Submit][Sta ...