Python学习札记(三十二) 面向对象编程 Object Oriented Program 3
参考:访问限制
NOTE
1.eg.
#!/usr/bin/env python3
class Student(object):
"""docstring for Student"""
def __init__(self, name, age, city):
self.__name = name
self.__age = age
self.__city = city
def print_info(self):
print(self.__name, self.__age, self.__city)
def changeinfo(self, option, value):
if option == 'name':
self.__name = value
elif option == 'age':
self.__age = value
elif option == 'city':
self.__city = value
def main():
student = Student('Chen', 20, 'FuZhou')
student.print_info()
cg = int(input())
if cg == 0:
student.changeinfo('name', input())
elif cg == 1:
student.changeinfo('age', int(input()))
elif cg == 2:
student.changeinfo('city', input())
student.print_info()
if __name__ == '__main__':
main()
sh-3.2# ./oop2.py
Chen 20 FuZhou
0
Wang
Wang 20 FuZhou
sh-3.2# ./oop2.py
Chen 20 FuZhou
1
21
Chen 21 FuZhou
sh-3.2# ./oop2.py
Chen 20 FuZhou
2
HangZhou
Chen 20 HangZhou
2.在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。但是,如果要确保外部代码不能随意修改对象内部的状态,就需要有private属性的存在。
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
如:
def __init__(self, name, age, city):
self.__name = name
self.__age = age
self.__city = city
其中__name,__age,__city是私有变量,无法被外界访问,需要借助类提供的方法来访问:
def print_info(self):
print(self.__name, self.__age, self.__city)
这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
3.需要注意的是与__xxx__变量的区别,它在Python中是特殊变量,也就是以双下划线开头,并且以双下划线结尾的,允许外部直接访问。
4.原理:不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name。
也就是:
_[类名]__[属性名]
外界也可以通过这样的方法引用它:
print(student._Student__name)
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
也就是说,不同的解释器会解释成不一样的结果。
5.Python本身没有任何机制阻止你干坏事,一切全靠自觉。有点培养代码洁癖的意思哈哈。
6.错误写法:
stu_a = Student('antonin', 20, 'SA')
stu_a.__name = 'Chen'
stu_a.print_info()
看上去像是从外部修改了__name属性,但是实际上是为这个对象新加入了一个属性__name,其本身的stu_a._Student__name 还是不变:
sh-3.2# ./oop3.py
antonin 20 SA
2017/2/25
Python学习札记(三十二) 面向对象编程 Object Oriented Program 3的更多相关文章
- Python学习札记(三十四) 面向对象编程 Object Oriented Program 5
参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...
- Python学习札记(三十九) 面向对象编程 Object Oriented Program 10
参考:使用枚举类 NOTE #!/usr/bin/env python3 from enum import Enum def main(): Mouth = Enum('Mouth', ('Jan', ...
- Python学习札记(三十八) 面向对象编程 Object Oriented Program 9
参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...
- Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__
参考:slots NOTE 1.动态语言灵活绑定属性及方法. #!/usr/bin/env python3 class MyClass(object): def __init__(self): pas ...
- Python学习札记(三十五) 面向对象编程 Object Oriented Program 6
参考:实例属性和类属性 NOTE Python是动态语言,根据类创建的实例可以任意绑定属性. class Student(object): def __init__(self, name): self ...
- Python学习札记(三十) 面向对象编程 Object Oriented Program 1
参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...
- Python学习札记(四十) 面向对象编程 Object Oriented Program 11
参考:使用元类 NOTE: type() 1.type()函数可以用于检查一个类或者变量的类型. #!/usr/bin/env python3 class Myclass(object): " ...
- Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property
参考:@property NOTE 1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核. #!/usr/bin/env python3 class MyClass(object ...
- Python学习札记(三十三) 面向对象编程 Object Oriented Program 4
参考:继承和多态 NOTE 著名的开闭原则: 对扩展开放:允许新增Animal子类: 对修改封闭:不需要修改依赖Animal类型的Animal_func()等函数. 1.eg. #!/usr/bin/ ...
随机推荐
- PostgreSQL远程代码执行漏洞(CVE-2018-1058)学习笔记
零.参考文献和绪论: 1.先知社区chybeta大神的--PostgreSQL 远程代码执行漏洞分析及利用—[CVE-2018-1058]--一文 2.博客园hunchill的--Mac 下 Post ...
- Unity3D笔记五 快捷键
一.近距离查看游戏对象 在Hierarchy视图中选择游戏对象,然后在Scene视图中按快捷键“F”来近距离查看该游戏对象. 二.游戏对象不在主摄像头中? Hierarchy中双击选择需要显示的游戏对 ...
- docker :no such file or directory
---恢复内容开始--- 其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: ...
- Mercurial
Contributing Changes http://nginx.org/en/docs/contributing_changes.html Mercurial is used to store s ...
- PHP的线性安全和非线性安全的区别
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方 ...
- Integer.valueof 和 Integer.parseInt
System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); System.out.p ...
- RPN网络
Region Proposal Network RPN的实现方式:在conv5-3的卷积feature map上用一个n*n的sliding window(论文中n=3)生成一个长度为256(ZF网络 ...
- Redis缓冲区设置
对于Redis服务器的输出(也就是命令的返回值)来说,其大小通常是不可控制的.有可能一个简单的命令,能够产生体积庞大的返回数据.另外也有可能因为执行了太多命令,导致产生返回数据的速率超过了往客户端发送 ...
- 小米范工具系列之七:小米范 web目录扫描器2.x版本发布
小米范web目录扫描器主要功能是探测web可能存在的目录及文件. 此工具使用java 1.8以上版本运行. 小米范web查找器2.x版本针对1.x版本(参考http://www.cnblogs.com ...
- 理解本真的REST架构风格(转,解释的最清楚)
add by zhj start: Fielding在批判性继承前人研究成果的基础上,建立起来一整套研究和评价软件架构的方法论.这套方法论的核心是“架构风格”这个概念.架构风格是一种研究和评价软件架构 ...