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/ ...
随机推荐
- 卸载vue-cli
全局安装:npm install vue-cli -g; 全局卸载:npm uninstall vue-cli -g; 查看vue版本,vue -V 回车,查看vue最新的版本.
- puremvc TS源码 (未测试...)
根据as的puremvc修改的,尚未具体测试.... https://files.cnblogs.com/files/gamedaybyday/puremvc_ts.rar 补充一个小游戏puremv ...
- 【BZOJ4372】烁烁的游戏 动态树分治+线段树
[BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...
- linux清理n天前的文件命令
记得有一次面试时问题改问题.现特此记录 find ${DATADIR}/user*.log -type f -mtime +1 -exec rm {} \; DATADIR是自己定义变量 -mtime ...
- ebay商品基本属性组合成数据表格式,可用上传到系统递交数据
该刊登表设计是利用VB写的,当时因为两个系统的数据不能直接对接,又copy并且组合SKU,一个表格一个表格填写,比较麻烦,还好刊登系统可以允许用excel表格上传数据 所以就下好模板,学了VB语言,在 ...
- 使用wireshark分析TLS
1.基本概念 SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字签名确保完整性.使用加密确保私密 ...
- 'ascii' codec can't decode byte 0xc4 in position 27: ordinal not in range(128)
This error happens when I try to run d:\linux\linuxkernel\android\内核\blog\BlogBackup(v1.1)source\htm ...
- Tdrag
Tdrag属于拖拽类的一款插件,基于jquery而成,兼容1.4以上版本的jquery,兼容浏览器:chrome.firfox.IE7等以上主流浏览器 插件加载 <script type=&qu ...
- PAT 1102 Invert a Binary Tree[比较简单]
1102 Invert a Binary Tree(25 分) The following is from Max Howell @twitter: Google: 90% of our engine ...
- Python中被双下划线包围的魔法方法
基本的魔法方法 __new__(cls[, ...]) 用来创建对象 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __i ...