Python:访问权限

前面一节重点学习了Python3中的面向对象最基础的类和对象的知识:类的定义、对象、构造方法、属性和方法等,在类中定义好的属性,就可以赋值、取值等一系列操作了。

例如:定义一个SmartPhone类,源码如下:

创建一个SmartPhone对象,打印调用打印信息方法后,再修改属性的值。但是,从前面SmartPhone类的定义来看,外部代码还是可以自由地修改一个实例的等属性的。如下:

运行结果如下:

Java中是通过关键字:私有的private、公开的public、默认受保护的protected等来限制属性、方法的访问权限的。如果在Python中,想要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,即:。

私有属性

在Python中规定:实例的变量名如果以开头,就变成了一个私有变量(private),只有类内部可以访问,类外部不能访问。

所以,我们把SmartPhone类的定义做一下修改:

创建一个SmartPhone对象,打印调用打印信息方法后,再访问私有属性,会报错:,如下:

运行结果:

可以看到运行结果报错了,意思是:

这是因为我们在type属性前加了,使变成了私有属性,只有类内部可以访问,类外部不能访问。

假如,我们在类的外部还想访问、修改类里面的私有属性怎么办?可能你已经想到了:给类添加访问、修改私有属性的方法!没错,修改如下:

创建对象,在外界获取和设置属性的值如下:

运行结果:

可以看到运行结果,在类的外部成功地获取、修改私有属性的值了。这样做,不是自找麻烦吗?那么,为什么要这样多此一举呢?这么做的意义非常大:在修改类中的属性前,可以对外界传入的数据做检查。例如:外界传入的品牌不是字符串,而是随意传入了一个整数:

运行结果:

这是未做检查的运行结果。在方法中做了数据检查,其他代码不变,更新的部分如下:

重新运行,运行结果:

起到了对传入的无效数据检查的作用。关于Python中异常的处理后面会学习,此处先拿来用下。:表示抛出异常,抛出一个的异常,并提示用户:

私有方法

Python中规定,私有方法同样以两个下划线开头,声明该方法为私有方法,只能在类的内部调用,不能在类地外部调用,形如:。

在上面的SmartPhone类中添加一个私有方法,代码如下:

创建一个SmartPhone类型的对象,

运行结果:

报错,意思是:。

提示

需要特别注意的是,在Python中,变量名类似的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量。而特殊变量是可以直接访问的,并不是私有的变量,所以我们自己在定义类中的私有属性时,千万不能用这样的变量名,以免混淆。

有些时候,你会看到以一个下划线开头的实例变量名,比如,这样的实例变量外部也是可以访问的。但是,按照Python约定俗成的规定,好的习惯是,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。

上面例子中,不能直接访问是因为Python解释器对外把变量改成了,所以,仍然可以通过来访问变量。例如:

运行结果:

但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把改成不同的变量名,不一定总是。

易错点举例

从表面上看,我们在外部代码中“成功”地把"8GB"设置了 变量,但实际上这个变量和class内部的变量不是一个变量!内部的变量已经被Python解释器自动改成了,而外部代码给phone1新增了一个变量。

运行结果:

运行结果印证了上面的话,这是一个易忽略点,要留意。

说明

类中还预定义了一些方法,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类,我们会在以后一一详细学习。

小结

本文主要通过几个简单的例子来学习类中私有属性和方法,以及它们之间的区别,要熟练掌握。

如果你观察的足够仔细,你会发现,例子中我们属性只有3个,增加了3对get\set方法,也就是6个。那么,如果属性非常多时,我们上面的做法又会显得非常麻烦,这有没有好的解决方案呢?答案是有的。python中给我们提供了一些关键词,专门帮我们解决上面的问题,我们会在后面详细学习这些知识。

人人懂编程ID:pythonDNA

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180422G0PDXX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券