Python 进阶系列笔记文章链接:
Python 进阶学习笔记之一:内置常用类型及方法
Python 进阶学习笔记之二:常用数据类型(上)
Python 进阶学习笔记之三:常用数据类型(下)
Python 进阶学习笔记之四:高效迭代器工具
Python 进阶学习笔记之五:异步 IO
Python 进阶学习笔记之六:多线程编程
Python 进阶学习笔记之七:互联网支持
Python 进阶学习笔记之八:面向对象高级编程
Python 进阶学习笔记之九:IO 编程
Python 进阶学习笔记之十:一般加密支持
Python 进阶学习笔记之十一:日志支持
Python 进阶学习笔记之十二:数据压缩与归档
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想,编码之前先要进行进行数据的抽象设计,把数据的特点特性进行抽象分类,进而抽象成一个一个的类,而对象就是一个个具体化的 “数据-行为” 个体。
1 面向对象基本概念
1.1 一个简单的类实现
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
在一个类中以两个下滑线开头和结尾的都有特殊含义,上面哪个类中的方法__init__
方法就是类的构造方法(初始化方法),而其内的 name 和 score 就是实例属性,需要在实例化一个对象时进行赋值(初始化)。类中方法和普通函数主要区别是,类中普通方法的第一个参数是self
,指向了调用对象本身,因此对象中的属性在这个方法中都能直接引用。
1.2 访问限制
在 Class 内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑,这称为数据封装。但是,从前面 Student 类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性:
>>> bart = Student('Bart Simpson', 98)
>>> bart.score
98
>>> bart.score = 59
>>> bart.score
59
一般我们做类设计时,目的之一就是为了隐藏数据操作或者统一数据操作,一般对外提供一个修改属性的方法,而不是直接对外开放属性,比如添加一个修改 score 的方法:
class Student(object):
def setSocre(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
这种方法的好处是,类提供者可以控制赋值操作的有效性。但要怎样对外隐藏属性?如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线 __
,在 Python 中,实例的变量名如果以 __
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量 .__name 和实例变量 .__score 了。如果外部需要获取属性值,我们也像上面提供修改属性方法那样提供一个获取方法即可:
class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):
return self.__score
需要注意的是,在Python中,变量名类似 __xxx__
的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以&#