参考:访问限制

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. SeaJS简介一:由来,特点以及优势

    由来: 在软件开发过程中,模块化编程思想已经习以为常了,模块化编程不仅仅给开发团队带来效率方面上的好处,还能够让开发的项目或者产品维护成本大大降低. 那么,在WEB开发过程中JS脚本语言已经不可或缺了 ...

  2. [WIFI] WIFI 破解(初级)

    话不多说,先来看看字典破解 wpa2 的效果 =================================== ========================================= ...

  3. Asp SqlDataSource将数据库数据绑定在 GridView

    1.首先认识一下GridView的几条属性 ☻AllowPaging  确定是否可以分页 ☻AllowSorting  确定是否可以进行排序 ☻AlternatingRowStyle  指定奇数行样式 ...

  4. Ajax 完整教程(转载)

    第 1 页 Ajax 简介 Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.本文的作者是 ...

  5. reflect 机制

    1: Class.forName的作用?为什么要用? 答:调用该访问返回一个以字符串指定类名的类的对象. 2: 通过反射,有几种方法可以实例化Class类对象? 3种,第一种:Class.forNam ...

  6. java之面向对象三大特征(封装,继承,多态)

    一.封装 封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的对外方法进行内部信息的操作和访问. 封装可以达到以下目的: 1)隐藏类的实现细节 2)让使用者只 ...

  7. ConcurrentHashMap实现解析

    ConcurrentHashMap是线程安全的HashMap的实现,具有更加高效的并发性.与HashTable不同,ConcurrentHashMap运用锁分离技术,尽量减小写操作时加锁的粒度,即在写 ...

  8. Git学习-->关于Jenkins编译时候,如何获取Git分支的当前分支名?

    一.背景 因为代码都迁移到了Gitlab,所以Jenkins编译的时候我们都需要将之前的SVN信息换成现在的Git信息.最近编译一个Lib库的时候,因为团队规定上传Release版本的AAR到Mave ...

  9. CentOS7 安装mysql-5.7.10(glibc版)

    groupadd mysql useradd -r -g mysql mysql 修改mysql目录及子文件属主和属组 chown -R mysql:mysql mysql shell> cd ...

  10. Cocos2d-JS实现的打飞机

    一.前言 今天我们来讲一个最最最常见的一个小游戏--打飞机!是的,打飞机!还记得小时候在玩儿的雷电,应该是打飞机最早的样子了吧.直到现在,也有微信打飞机,全民飞机大战,全民打飞机等游戏的出现,这些游戏 ...