Objects
OOP(Object-Oriented Programming)
类(class)
定义了某种类型的多个对象该如何表现 ### 对象(object) 类的一个实例,决定该类的类型 ### 方法(method) 在对象上调用的函数,使用点(.)调用 注意 方法不同于函数在于方法特定于对应对象 ### 蕴含理念 将复杂的大型程序组织成小的模块化组件 - 使用数据抽象 - 捆绑多个信息与相关行为 使用分散状态的计算 - 每个对象有自己的本地状态 - 每个对象也知道如何管理自己的本地状态 - 使用方法与对象交互 - 几个对象可能属于一个共同类的实例 - 不同的类可以相互关联
例:Lists
内置的list函数其实是一个类 在可迭代对象上调用list可以创建一个list类的新实例 list类定义了有关list的各种用法: - 方法:append, extend, insert ,etc. - 加法与乘法运算 - 元素查找与赋值
1
2
3
print(list)
s = list(range(3))
print(type(s))<class 'list'>
<class 'list'>
Class Statement
一个类描述了其实例的行为 例如,我们定义一个银行账户类,实现的功能如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Account: # 一个类以class开头,并给他命名
def __init__(self, account_holder):
'''
定义创建类的新实例时会发生什么,即给予对象属性
一般使用方法名__init__来构造一个类的实例,调用时自动执行, 该方法有时也被称为构造方法
将新实例称为self,并给它分配属性,其中,account_holder是调用时传入的内容
'''
self.balance = 0
self.holder = account_holder
def deposit(self, amount):
'''
deposit方法调用两个参数
self: self是该方法被调用时的类的实例
amount:添加的余额
'''
self.balance = self.balance + amount
return self.balance # 出现输出时的情况,若没有return则返回None
def withdraw(self, amount):
if amount > self.balance: # 引用balance时要加.,因为其是对象的一个属性
return 'Insufficient funds'
self.balance = self.balance - amount
return self.balanceCreating Instances
Object Construction
当一个类被调用时: - 创建一个该类的新的实例 -
__init__方法被调用,其中以新对象作为其中的第一个元素,
一般命名为self, 并带有在调用表达式中的任何额外参数
1
2
3
a = Account('Alan')
print(a.holder)
print(a.balance)Alan
0
Instance Attributes
对象的属性可以通过点号表达式(.)来访问与更改 若属性之前不存在, 也可以为其赋值, 可以在任何时候增加新的属性
1
2
3
4
5
a.balance = 12 # 已存在的属性可以被更改
b = Account('Ada')
b.balance = 20
a.backup = b # 新属性可以在任何时候添加
print(a.backup.balance)20
Object Identity
每个用户定义类的对象都有一个唯一的标识
标识运算符is与is not可以判断两个表达式是否是相同的对象
使用赋值将一个对象绑定到一个新名称时不会创建一个新对象
1
2
3
4
print(a is a)
print(a is not b)
c = a
print(a is c)True
True
True
Methods
Invoking Methods
调用方法意味着用点表达式定义类中定义的一个方法 所有调用方法都通过self变量访问对象,所以他们可以访问与操作对象的属性 如deposit方法中定义了两个参数, 但点表达式会自动为方法提供第一个参数
1
2
tom = Account('Tom')
print(tom.deposit(100)) # 调用时只需要一个参数, 方法会自动绑定到self(这里是tom)100