python面向对象教学课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

a = Account("Huang") print(a.balance) a.deposit(100) a.withdraw(10) print(a.balance)
b = Account("Li") c = Account("Li") b.balance = 100 c.balance = 80 print(b.balance =_是在对象消亡时由 python自动调用的函数, 一般用于完成对象的消亡 前处理操作
15
继承、重写、多态、访问限制
16
继承
• 类别可以存在层级关系 • 实现代码复用的重要方式
17
继承
• 例如: – 定义一个新类型的账户,具有取款手续费
class CheckingAccount: def __init__(self, account_holder): self.balance = 0 self.holder = account_holder def deposit(self, amount): self.balance += amount def withdraw_charge(self, amount): self.balance -= (amount + 1)
class CheckingAccount(Account): def __init__(self, acc_holder, balance): Account.__init__(self, acc_holder) self.balance = balance
super().__init__(acc_holder)
a = Account("Huang") a.deposit(100) print(a.deposit)
在通过对象调用成员函数时, python解释器自动将对象 作为第一个参数传给该方法
10
通过类调用成员 函数
• 成员函数也可以通过类进行访问和调用,此时应自行指定需要 传入的参数
b = Account("Li") Account.deposit(b, 100) print(b.balance)
14
• 利用类成员进行类级别的操作,如: – 对对象进行计数
class CountedAccount: count = 0 def __init__(self, account_holder): self.holder = account_holder CountedAccount.count += 1 def __del__(self): CountedAccount.count -= 1
– 保持函数名称一致有利于保持接口的一致性
– 同时新取代了原先的方法,防止了调用错误的发生
• 在派生类的对象发生成员函数调用时,根据成员访问规则,将 优先访问派生类中定义的成员函数
Account.withdraw(jack, amount + 1)
可以通过类属性的方 式显式地调用父类中 的成员函数
20
0.2 0.2 通过实例可以访问类成员 0.2
0.3 0.2 0.2
实例对象和类可以拥有同 名的成员
0.3 0.4 0.4
对类成员的重新绑定(改 变值)只能通过类进行
13
类中成员访问的原则
• 如果实例成员和类成员同名,访问哪一个?
– 先在实例成员列表中查找绑定关系 – 再在类成员列表中查找绑定关系
class CheckingAccount(Account): pass #空语句,占位以保持程序结构完整
21
__init__函数的重写
• 如果 init 函数发生重写,派生类应负责全部数据的初始化
class CheckingAccount(Account): def __init__(self, acc_holder, balance): self.balance = balance self.holder = ac_holder
与Account有 大量重复
class Account: def __init__(self, account_holder): self.balance = 0 self.holder = account_holder def deposit(self, amount): self.balance += amount def withdraw(self, amount): self.balance -= amount
• 相同消息可以被发送给不同对象,可能引发不同的程序行为, 这是面向对象特有的多态
4
类和对象
5
类定义
• 类定义基本形式:
• 类体中可以定义属性,包括变量属性和函数属性 – 变量属性(成员变量)描述了对象的状态(数据) – 函数属性(成员函数)描述了对对象可以进行的操作
6
类定义例子
• 定义一个账户类,描述银行账户相关的信息 – 账户名称、余额、存款、取款等
__init__是在创建对象时由 python自动调用的函数, 用于完成对象的初始化操作
b = Account("Li") print(b.holder)
8
使用 对象
• 每个实例对象都拥有类中定义的属性 – 可以直接访问成员变量(数据),修改变量的值 – 可以通过方法调用完成所需功能
• 一个类可以创建多个对象
类方法的第一个参数总是self, 指向实例本身,Python自动 将实例对象作为第一个参数 传入方法中
– 成员变量:balance、holder – 成员函数:deposit、withdraw、 init
7
创建实例对象
• 类似于函数调用 • 创建对象一般通过调用__init__方法进行 • 若没有__init__方法参数可以为空
__init__函数的继承
• init 函数可以继承 – 如果派生类中不定义 init 函数,则继承基类的 init 函数 完成派生类对象的初始化
class Account: def __init__(self, acc_holder): self.balance = 0 self.holder = acc_holder
Python 面 向对象
面向对象的理解
• 面向过程——根据功能需求,总结需要完成的步骤,按步 骤从前到后写代码,最后达到既定目标
• 面向对象也是我们认识世界的一种重要方式 • 面向对象——基于类和对象,以数据为中心
2
“一切皆对象”
• 整型、浮点型、字符串值是对象 • List、Map、Set、Tuple是对象 • 函数是对象 • ……
9
调用成员 函数
• 对象是数据和操作的集合 – 数据描述对象的状态,每个对象可以具有独立的状态
– 操作对状态进行改变 • 通过self参数,成员函数可以访问改变当前对象的状态
class Account: #... def deposit(self, amount): self.balance += amount #...
18
继承
• 一个类所描述的对象特征可以从其它的类继承获得。
派生类(子类)
基类(父类)
class CheckingAccount(Account): def withdraw_charge(self, amount): self.balance -= (amount + 1)
– CheckingAccount的对象拥有Account中定义的属性
• 如果在派生类中需要对现有功能进行改变或扩充,可以重新进 行成员函数的定义
class CheckingAccount(Account): def withdraw_charge(self, amount): self.withdraw(self, amount + 1) super().withdraw(amount + 1)
class Account: def __init__(self, account_holder): self.balance = 0 self.holder = account_holder def deposit(self, amount): self.balance += amount def withdraw(self, amount): self.balance -= amount
True False True True
23
多态
• 可以用通用的操作(相同的消息)来操作不同的对象
– 不同的对象 可能进行 不同的响应
消息的多态
– 外部操作是一致的(withdraw),但对象的实际行为不同
def withdraw(account, amount):
也可以显式 调用基类的 初始化函数
或通过super 函数找到该 类的基类
22
多态
• 同一个对象既是基类对象,也可以是派生类的对象 – 具有基类公开属性的实现(虽然可能会被重写) – 派生类可以看做是对基类的一种扩展
类型的多态
print(issubclass(Account, CheckingAccount)) print(issubclass(CheckingAccount, Account))
class Account: def __init__(self, account_holder): self.balance = 0 self.holder = account_holder def deposit(self, amount): self.balance += amount def withdraw(self, amount): self.balance -= amount
12
a = Account("Huang") b = Account("Li") print(a.interest) print(b.interest) print(Account.interest) a.interest = 0.3 print(a.interest) print(b.interest) print(Account.interest) Account.interest = 0.4 print(a.interest) print(b.interest) print(Account.interest)
11
类属性(类成员)与实例属性
• 对整个类共同特征的描述 • 在同一个类的不同对象之间共享数据的方式
class Account: interest = 0.2 def __init__(self, account_holder): self.balance = 0 self.holder = account_holder def deposit(self, amount): self.balance += amount def withdraw(self, amount): self.balance -= amount
False True
bob = Account("Bob") jack = CheckingAccount("Jack") print(isinstance(bob, Account)) print(isinstance(bob, CheckingAccount)) print(isinstance(jack, Account)) print(isinstance(jack, CheckingAccount))
>>> type(3) <class 'int'> >>> type("Hello") <class 'str'> >>> type([1,2]) <class 'list'>
列表对象调用sort方法
3
面向对象程 序设计
• 面向对象程序设计具有以下几个特征: – 程序由若干对象组成,每个对象是由数据以及对这些数据所 能实施的操作所构成的封装体; – 对象的特征由相应的类来描述; – 对数据的使用是通过向包含数据的对象发送消息来实现的; – 一个类所描述的对象特征可以从其它的类继承获得。
jack = CheckingAccount("Jack") print(jack.balance) jack.deposit(100)
在派生类中找不到的绑定关 系,会在其基类中继续寻找
– CheckingAccount的对象也拥有新定义的属性
jack.withdraw_charge(10)
19
重写
相关文档
最新文档