typora-copy-images-to: Python 编程导论
文章目录
Python 编程导论 Chapter 8 —— 类与面向对象编程
- 重点是面向对象编程的环境下使用类,面向对象编程的关键,是将对象看做是数据和可以在数据上执行的方法的集合
- Python 的对象都有类型,定义了程序能够在这个对象上执行的操作
8.1 抽象数据类型与类
-
抽象数据类型,是指由对象以及对象上的操作组成的集合,捆绑为一个整体,可以传递到程序的另一个部分,可以使用对象数据属性以及使用对象上的操作
-
目的,使程序易于修改,控制程序复杂程度,两种机制可以完成这个任务:
- 分解,使程序具有结构
- 抽象,隐藏细节
-
Python语言中,使用类实现数据抽象,以下是一个类定义,实现对整数集合的抽象:
class IntSet(object):
"""IntSet是一个整数集合"""
# 关于实现的信息
# 集合的值由一个整合组self.vals表示
# 集合中的每个整数在self.vals中只出现一次
def__init__(self):
"""创建一个空的整数集合"""
self.vals = []
def insert(self,e):
if e not in self.vals:
self.vals.append(e)
def member(self,e):
"""假设e是整数
如果e在self中,则返回True,否则返回False"""
return e in self.vals
def remove(self,e):
"""假设e是整数,从self中删除e
如果e不在self中,则抛出ValueError异常"""
try:
self.vals.remove(e)
except:
raise ValueError(str(e) + ' not found')
def getMembers(self):
"""返回一个包含self中元素的列表
对元素不进行排序"""
return self.vals[:]
def __str__(self):
"""返回一个表示self的字符串"""
self.vals.sort()
result = ""
for e in self.vals:
result = result + str(e) + ","
return '{' + result[:-1] + '}'
s = IntSet()
s.insert(3)
print(s.member(3))
# 以上代码可以创建一个实例,并在这个IntSet中插入整数3,然后输出True
-
类支持两种操作:
- 实例化:创建类的实例 例如:s = IntSet()
- 属性引用:通过点标记法访问与类关联的属性,如:s.member
-
Python 中的特殊方法名,__ init__,只要一个类被实例化,就会调用该类中定义的__ init __方法
-
方法属性定义在类定义中,类被实例化后,实例属性才被创建
-
数据属性被关联到类时,称其为类变量,数据属性被关联到实例时,将其称为实例变量
-
表示不变性定义了数据属性中的哪个值对应着类实例的有效表示
8.1.1 使用抽象数据类型设计程序
- 程序是类型的集合,替代以函数为中心的理念
- 数据抽象一般会比单个函数包含更多功能
8.1.2 使用类记录学生与教师
- 应该先仔细思考可能有用的抽象,是否有一种抽象可以覆盖学生、教授、职员的常用属性?
- Python 标准库模块datetime,提供了很多创建和处理日期数据的方法
import datetime
class Person(object):
def __init__(self, name):
"""创建一个人"""
self.name = name
try:
lastBlank = name.rindex(' ') # 查找子字符串最后出现的位置
self.lastName = name[lastBlank+1