深入理解Python面向对象编程:从dabeaz-course/practical-python学习类与对象
面向对象编程(OOP)是Python编程中非常重要的概念,本文将通过dabeaz-course/practical-python项目中的示例,带你深入理解Python中的类和对象。
什么是面向对象编程?
面向对象编程是一种将代码组织为对象集合的编程技术。每个对象包含:
- 数据(称为属性)
- 行为(称为方法,即应用于对象的函数)
其实你已经在本课程中不知不觉使用了面向对象编程。例如操作列表:
nums = [1, 2, 3]
nums.append(4) # 方法调用
nums.insert(1,10) # 方法调用
print(nums) # 数据访问
这里nums
就是列表类的一个实例,append()
和insert()
是附加到这个实例上的方法。
类的定义与使用
定义类
使用class
语句定义新对象类型:
class Player:
def __init__(self, x, y):
self.x = x
self.y = y
self.health = 100
def move(self, dx, dy):
self.x += dx
self.y += dy
def damage(self, pts):
self.health -= pts
简单来说,类是一组对实例执行各种操作的函数集合。
创建实例
实例是程序中实际操作的对象,通过像函数一样调用类来创建:
player1 = Player(2, 3)
player2 = Player(10, 20)
player1
和player2
都是Player
类的实例。
重要提示:class
语句只是定义(本身不执行任何操作),类似于函数定义。
实例数据与方法
实例数据
每个实例都有自己的数据,这些数据由__init__()
方法初始化:
class Player:
def __init__(self, x, y):
# 存储在self上的任何值都是实例数据
self.x = x
self.y = y
self.health = 100
Python对存储的属性数量和类型没有任何限制。
实例方法
实例方法是应用于对象实例的函数:
class Player:
def move(self, dx, dy):
self.x += dx
self.y += dy
对象本身总是作为第一个参数传递(按约定称为self
):
player1.move(1, 2)
# 相当于:
# self = player1
# dx = 1
# dy = 2
类与作用域
需要注意,类不会创建新的命名空间:
class Player:
def left(self, amt):
move(-amt, 0) # 错误!调用全局move函数
self.move(-amt, 0) # 正确!调用类的move方法
要操作实例,必须显式引用它(如self
)。
实践练习
练习4.1:将对象作为数据结构
在之前章节中,我们使用元组或字典表示数据。例如股票持仓可以表示为:
# 元组表示
s = ('GOOG', 100, 490.10)
# 字典表示
s = {'name': 'GOOG', 'shares': 100, 'price': 490.10}
现在,我们可以用类来更好地组织数据。创建一个Stock
类表示单支股票持仓:
class Stock:
def __init__(self, name, shares, price):
self.name = name
self.shares = shares
self.price = price
使用示例:
a = Stock('GOOG', 100, 490.10)
print(a.name) # 'GOOG'
print(a.shares) # 100
print(a.price) # 490.1
练习4.2:添加方法
可以向类中添加方法(操作对象数据的函数):
class Stock:
def cost(self):
return self.shares * self.price
def sell(self, n):
self.shares -= n
使用示例:
s = Stock('GOOG', 100, 490.10)
print(s.cost()) # 49010.0
s.sell(25)
print(s.shares) # 75
练习4.3:创建实例列表
从字典列表创建Stock实例列表:
portfolio = [Stock(d['name'], d['shares'], d['price']) for d in portdicts]
total = sum(s.cost() for s in portfolio)
练习4.4:在项目中使用类
修改report.py
中的read_portfolio()
函数,使其读取投资组合到Stock实例列表中,并调整所有相关代码使用Stock实例而非字典。
总结
通过本文,你应该已经掌握了:
- Python中类与对象的基本概念
- 如何定义类并创建实例
- 实例数据与方法的区别与使用
- 如何将面向对象思想应用到实际项目中
面向对象编程能更好地组织代码,提高可维护性,是Python编程中必须掌握的重要技能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考