参考:访问限制

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的更多相关文章

  1. Python学习札记(三十四) 面向对象编程 Object Oriented Program 5

    参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...

  2. Python学习札记(三十九) 面向对象编程 Object Oriented Program 10

    参考:使用枚举类 NOTE #!/usr/bin/env python3 from enum import Enum def main(): Mouth = Enum('Mouth', ('Jan', ...

  3. Python学习札记(三十八) 面向对象编程 Object Oriented Program 9

    参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...

  4. Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__

    参考:slots NOTE 1.动态语言灵活绑定属性及方法. #!/usr/bin/env python3 class MyClass(object): def __init__(self): pas ...

  5. Python学习札记(三十五) 面向对象编程 Object Oriented Program 6

    参考:实例属性和类属性 NOTE Python是动态语言,根据类创建的实例可以任意绑定属性. class Student(object): def __init__(self, name): self ...

  6. Python学习札记(三十) 面向对象编程 Object Oriented Program 1

    参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...

  7. Python学习札记(四十) 面向对象编程 Object Oriented Program 11

    参考:使用元类 NOTE: type() 1.type()函数可以用于检查一个类或者变量的类型. #!/usr/bin/env python3 class Myclass(object): " ...

  8. Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property

    参考:@property NOTE 1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核. #!/usr/bin/env python3 class MyClass(object ...

  9. Python学习札记(三十三) 面向对象编程 Object Oriented Program 4

    参考:继承和多态 NOTE 著名的开闭原则: 对扩展开放:允许新增Animal子类: 对修改封闭:不需要修改依赖Animal类型的Animal_func()等函数. 1.eg. #!/usr/bin/ ...

随机推荐

  1. html5实现的一些效果

    一.网页换肤 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  2. 微信小游戏 Egret开发数据域官方Demo下载地址

    随着引擎的升级,伴随而来就是各种问题,使用官方调试过的Demo,少走弯路. Mark下 官方Demo

  3. 【BZOJ3727】PA2014 Final Zadanie 树形DP

    [BZOJ3727]PA2014 Final Zadanie Description 吉丽YY了一道神题,题面是这样的:“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行 ...

  4. MacBook Pro Retina 安装WIN7 - 对抗模糊及其它

    最近对虚拟机里的WIN7受够了,把整个虚拟机都删了,准备装双系统. 安装过程还是很简单的,网上教程一大堆,就是通过MAC OS X自带的BootCamp工具来管理整个安装过程,我是用外置光驱安装的,没 ...

  5. 解决IE7下scroll的bug

    IE7下scroll滚动问题 没法撑开 ie7下没办法撑开div; 即是设置了overflow-y:scroll; 解决版本:给设置scroll的容器加上position:relative

  6. Android N 通知概览及example

    概述 Android App的通知在维护你的App和用户之间的交互起着举足轻重的作用,为了提供更好的用户体验,Android N上的通知提供了可视化刷新,自定义视图和直接回复等功能.另外还提出了Mes ...

  7. pta 天梯地图 (Dijkstra)

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  8. 强制关机导致ORA-03113

    数据库启动报错:无法打开数据库. [oracle@localhost ORCL]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Productio ...

  9. redhat 6安装详解

    备注:redhat 6 系列OS安装步骤一致. 此处安装redhat 6.5 64位版本,即rhel-server-6.5-x86_64-dvd.iso 一.安装RHEL 6.5 用光盘成功引导系统, ...

  10. 深入理解flannel

    1 概述 根据官网的描述,flannel是一个专为kubernetes定制的三层网络解决方案.它主要用于解决容器的跨主机通信问题.首先我们来简单看一下,它是如何工作的. 首先,flannel会利用Ku ...