深入理解Python面向对象编程:从dabeaz-course/practical-python学习类与对象

深入理解Python面向对象编程:从dabeaz-course/practical-python学习类与对象

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

面向对象编程(OOP)是Python编程中非常重要的概念,本文将通过dabeaz-course/practical-python项目中的示例,带你深入理解Python中的类和对象。

什么是面向对象编程?

面向对象编程是一种将代码组织为对象集合的编程技术。每个对象包含:

  1. 数据(称为属性)
  2. 行为(称为方法,即应用于对象的函数)

其实你已经在本课程中不知不觉使用了面向对象编程。例如操作列表:

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)

player1player2都是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实例而非字典。

总结

通过本文,你应该已经掌握了:

  1. Python中类与对象的基本概念
  2. 如何定义类并创建实例
  3. 实例数据与方法的区别与使用
  4. 如何将面向对象思想应用到实际项目中

面向对象编程能更好地组织代码,提高可维护性,是Python编程中必须掌握的重要技能。

practical-python Practical Python Programming (course by @dabeaz) practical-python 项目地址: https://gitcode.com/gh_mirrors/pr/practical-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廉贵治

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值