博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python面向对象-访问权限public和private
阅读量:7067 次
发布时间:2019-06-28

本文共 1664 字,大约阅读时间需要 5 分钟。

上一节我们介绍了,Class内部可以有属性和方法,外部代码通过直接调用实例的方法来操作数据,这样就可以隐藏内部的逻辑实现;同时,外部代码还是可以自由的修改实例的属性和增加方法。

但是有时候,我们不想这样呢?即不让内部属性被外部访问。

可以在属性的名称前面加上两个下划线__。如果一个变量以__开头,就变成了一个私有变量private,只有内部可以访问。

修改一下Student类:

class Student(object):    def __init__(self,name,score):            self.__name = name            self.__score = score    def print_stu(self):            print('姓名:%s,成绩%s'%(self.__name,self.__score))

现在已经无法从外部访问实例.__name和实例.__score了:

>>> wc = Student('wc',66)>>> wc.__nameTraceback (most recent call last):  File "
", line 1, in
AttributeError: 'Student' object has no attribute '__name'

如果我们的确需要从外部获取name和score呢?通常的做法,是给类增加get的方法:

class Student(object):    def __init__(self,name,score):            self.__name = name            self.__score = score    def print_stu(self):            print('姓名:%s,成绩:%s'%(self.__name,self.__score))    def getName(self):            return self.__name    def getScore(self):            return self.__score

同理,我们还可以给该类增加setName的方法,使得外部代码可以先修改name。同时,我们还可以在这些方法中增加健壮性检查,避免传入错误的参数。

注意:python中,变量名类似于__xxx__的,是特殊变量,是可以直接访问的,并不是私有变量。有些时候,可能会出现_name这样的变量,这样的变量也是可以访问的,但是约定俗成:可以被访问,但是最好不要随意访问。

问题又来了,类似于__xxx双下划綫开头的变量,真的不能被外部访问吗?其实也可以访问。python解释器对外会把__name变量变成_Student__name,你按照实例.__name当然访问不了了,这时可以使用实例._Student__name来访问__name变量:

>>> wc._Student__name'wc'

但是,不同版本的python解释器可能会把__name改成不同的变量名,强烈建议你程序不能这么干。

再来看一个例子:

>>> ly = Student('ly',55)>>> ly.getName()'ly'>>> ly.__name = 'haha'>>> ly.__name'haha'

表面上,外部代码好像成功的设置了__name变量,其实不是的。这里的__name变量和class内部的__name变量并不是一个变量。验证:

>>> ly.getName()'ly'

 

posted on
2018-03-06 19:25 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/hiwuchong/p/8516277.html

你可能感兴趣的文章
Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器...
查看>>
获取用户信息
查看>>
洛谷P3952 时间复杂度
查看>>
Leetcode | Parentheses 相关
查看>>
Ajax分页问题
查看>>
如何禁止内部viewPager滑动
查看>>
简单的转义字符
查看>>
RabbitMQ入门-Topic模式
查看>>
poj 2777 Count Color(线段树区间更新)
查看>>
Java数据结构与算法(5) - ch05链表(LinkList)
查看>>
CLR Via CSharp读书笔记(21):自动内存管理(垃圾回收)
查看>>
刚刚接触python的感想
查看>>
modelsim使用常见问题及解决办法集锦 ②
查看>>
常用的第三方库
查看>>
java 操作elasticsearch之搭建测试项目环境
查看>>
iOS-图文表并茂,手把手教你GCD
查看>>
python之logging模块
查看>>
让Android Studio支持系统签名
查看>>
quick 状态机StateMachine
查看>>
Node学习5-events模块
查看>>