Python面向对象-访问权限public和private
上一节我们介绍了,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.__name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
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'
Python面向对象-访问权限public和private的更多相关文章
- C# 成员默认访问权限(public、private、protected、internal)
		
C# 成员默认访问权限(public.private.protected.internal) 来源 https://www.cnblogs.com/yezongjie/p/20181121Access ...
 - Java的访问权限(public并不等于默认)
		
一共有四种访问权限,对应四个范围 1.private :只有本类内可以使用,即使是子类也没权使用 2.protect :子类和友好类能够使用,继承中经常用到 3.默认值,(就是什么都没写),只有同包名 ...
 - Ruby中访问控制符public,private,protected区别总结
		
重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this cla ...
 - 访问权限,public private protected
		
百度经验这篇文章很不错:https://jingyan.baidu.com/article/bad08e1e8e9a9b09c851219f.html
 - java类成员访问权限总结(private,default,protected,public)
 - Python面向对象-访问限制
		
在Class内部,可以有字段,方法和属性,而外部代码可以通过直接调用实例变量的方法来操作数据, (1)私有普通字段 比如对于下面的Student类,name字段可以在外面通过对象进行直接访问: cla ...
 - Python变量访问权限控制
		
oop1.py文件代码 # user/bin/python class Foo: def bar(self): print('ok') def hello(self, name): print(&qu ...
 - 访问权限PPP(public、private、protected、default)之成员变量、成员变量权限解析
		
首先,我们需要清楚一下方法是由哪些部分构成的: [权限修饰符列表][别的修饰符列表] 返回值类型 方法名(参数列表){ 方法体:} 然后我们需要知道成员变量和成员方法访问有几种情况:1.当前包同一 ...
 - 访问权限系列一(public/private/protected/default):成员变量
		
通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...
 
随机推荐
- Hadoop之HDFS文件系统
			
概念 HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件:其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色. HDFS的设计适合一次写入,多次读出的场景,且不 ...
 - [ch04-01] 用最小二乘法解决线性回归问题
			
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 4.1 最小二乘法 4.1.1 历史 最小二乘法,也叫做 ...
 - 01        JavaScript变量的声明、变量的使用、变量的命名规范和规则
			
变量的声明,关键字:var //声明一个变量 var name; //给变量赋值 name = '哈士奇'; //声明并赋值一个变量 var name = '哈士奇'; 变量的使用 //声明并赋值一个 ...
 - Java基础部分(11~20)
			
11."=="和 equals 方法究竟有什么区别? (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ==操作符专门用来比较两 ...
 - input 输入框 只能输入数字、字母、汉字等
			
1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...
 - Qt之高DPI显示器(二) - 自适配解决方案分析
			
目录 一.回顾 二.框架说明 1.ICallDPIChanged 2.IDPIHelper 3.悬浮窗体管理器 三.方案分析 1.窗口大小 2.字体大小 3.间距 4.图标 四.相关文章 原文链接:Q ...
 - eclipse color theme 离线安装方法以及jar包
			
1. 用户可以点击下载eclipse-color-theme-update-site.zip或者下载我已经下载好的color jar包 2. 把文件com.github.eclipseco ...
 - AntV G2 图表tooltip重命名
			
在做数据可视化的过程中,遇到了一个问题,就是给图表tooltip重命名. 在研究后,发现了三种方法: 方法1:一般情况下,可以在给chart绑定数据源时,添加scale配置,并在scale配置中设置别 ...
 - [TimLinux] 开博一个月了
			
做事情,怕的确实是坚持!为了自己尽可能的每天一篇博文,时常在下班后,23点开始写博,有时候写到接近一点钟.但是这第一个月,确实坚持下来了.平均每天一篇.写博的过程,其实是: 知识的总结过程: 因为要求 ...
 - Python numpy的基本操作你一般人都不会
			
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要最新Python学习资料的小伙伴可以加点击下方链接自行获取 ...