python之中特性(attribute)与属性(property)有啥区别( 三 )
访问器方法。访问器是一个简单的方法,它能够使用getHeight、setHeight这样的名字来得到(getHeight)或者重绑定(setHeight)一些特性(这里的特性是指在__init__中初始化的一些变量:self.name = \u0026#39;ZhangSan\u0026#39;)或者属性(也可能是类的私有属性(这里的属性是指类本身的一些性质)——具体内容请参见第7章的“再论私有化”部分)。将状态变量(特性)封装起来,然后让访问者通过封装的方法(或者函数)进行访问,是很重要的一件事。比如下面例子中的Rectangle类:class Rectangle: def __init__(self): self.width = 0 self.height = 0 def setSize(self, size): self.width, self.height = size def getSize(self): return self.width, self.height下面的例子演示如何使用这个类:\u0026gt;\u0026gt;\u0026gt; r = Rectangle() #这里实例化\u0026gt;\u0026gt;\u0026gt; r.width = 10 \u0026gt;\u0026gt;\u0026gt; r.height = 5\u0026gt;\u0026gt;\u0026gt; r.getSize() #可以得到width和height特性(实例被赋值后,属性width和height被赋值变为特有性质(特性))(10, 5)\u0026gt;\u0026gt;\u0026gt; r.setSize((150, 100)) #将width=150和height=100特性(这里也应该是实例的属性被赋值后变为特性)通过setSize封装起来,然后可供getSize函数进行访问。\u0026gt;\u0026gt;\u0026gt; r.width #这里就是访问实例的width特性(因为实例的属性width被赋予了值150,变成它特有的性质,叫做特性)150在上面的例子中,getSize和setSize方法是设想在实例中存在名为size特性的访问器方法(其实在上例中并不存在size特性),size由width和height构成的元组。读者可以随意使用一些更有趣的方法替换这里的函数,例如计算面积或者对角线的长度。这些代码(getSize和setSize方法)没错,但有缺陷——当程序员去使用这个类时,不应该还要思考它是怎么实现封装的。 如果有一天改变了类的实现——将size变成一个真正的特性,这样width和height就可以使用r.size来展示——那么就要把它们放到一个访问器方法中,并且任何调用了这个类的程序都必须重写调用方法(将r.getSize()和r.setSize()重写为r.size和r.size = (150, 100)),客户代码应该能够用同样的方式去访问所有特性。 如何实现上面说的将size变成一个真正的特性呢?将元类代码中所有的属性都放到访问器中?这样子当然没问题,但如果有很多简单的特性要去访问(例如面积和对角线的长度等等...),那么就很笨了,需要写很多访问器才行,它们除了返回(getSize)或者重新绑定(setSize)之外不做任何事,这样不管是尺寸、面积、对角线长度等等特性,都需要写两个访问器方法(get和set)。这样就很繁琐了(不管调用尺寸、面积、对角线长度等,都需要get+尺寸/面积/对角线长度这样的方法,如果能只是用尺寸/面积/对角线长度这样简单的的方法来进行该有多好),复制加粘贴式或切割代码式的编程方式显然是很糟糕的(尽管是在一些语言中针对这样的特殊问题很普遍)。幸好,Python能隐藏访问器方法(r.size和r.size = (150, 100)都没有显示出访问器方法,但是都有相同的作用,这就是隐藏的好处),让所有特性看起来一样(r.size和r.size = (150, 100)、r.area和r.area = 600、r.diagonal和r.diagonal = 80这些特性看起来没什么差别)。以上这些被访问器定义的特性(self.width和self.height)称为属性。(这里我理解为属性就是被访问器定义的self.width和self.height,而特性就是对属性(self.width和self.height)进行“getSize”和“setSize”的操作的拦截(将以上两个操作,通过size = property(getSize, setSize)拦截后,size就是特性(这里也可以理解为拦截后具有的独特性质size)))
推荐阅读
- 怎样成为一名合格的Python程序员?
- python 爬虫,咋获得输入验证码之后的搜索结果
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- 零基础入门学习啥语言好
- Python3.4和3.5区别大么
- python 中 def_():...... return _有啥作用
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 30岁男,创业失败转行学python,是否很晚?也不好找工作?
- Python 的开发速度比 C#.net 或 Vb.net 更快吗?
- 16年毕业,建筑环境与设备工程专业,干的一直是工程想转IT专业,想从python入手请问咋开始学习
