博客
关于我
翻译:《实用的Python编程》04_01_Class
阅读量:427 次
发布时间:2019-03-06

本文共 2261 字,大约阅读时间需要 7 分钟。

4.1 类

本节将介绍 class 语句的使用以及如何通过类创建新对象。

面向对象编程(OOP)

面向对象编程是一种将代码组织成对象集合的编程技术。一个对象通常包括以下几个方面:

  • 数据(Attributes):对象的属性,如 xy
  • 行为(Methods):对对象执行操作的函数,如 move()damage()

在本课程中,你已经使用了面向对象编程技术。例如,操作列表 nums 是一个列表的实例,其方法 append()insert() 被绑定到该实例上。

类定义语句

使用 class 语句定义一个新的对象类。以下是一个简单的 Player 类示例:

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

类是一个函数的模板,用于创建实例。类定义本身不会执行任何操作,它只是一个蓝图。

实例

实例是你在程序中操作的具体对象。通过调用类来创建实例:

a = Player(2, 3)b = Player(10, 20)

ab 都是 Player 类的实例,它们各自拥有一组数据和行为。

实例数据

每个实例都有自己的局部数据。这些数据通过 __init__() 方法初始化:

class Player:    def __init__(self, x, y):        self.x = x  # 实例数据        self.y = y        self.health = 100

实例可以随时访问它们的属性,如 a.xb.x

实例方法

实例方法是应用于对象实例的函数。例如,Player 类的 move() 方法:

a.move(1, 2)

方法会将 self 作为第一个参数传递。self 通常用来表示当前对象实例。

类作用域

类未定义名称的作用域。例如,Player 类中的 move() 方法可以调用类中的另一个方法 self.move()

def move(self, dx, dy):    self.x += dx    self.y += dy    self.move(-amt, 0)

通过 self 可以显式地引用实例。


练习

练习 4.1:将对象当做数据结构

在本节的前面部分,我们使用元组和字典表示数据。为了更好地组织代码,我们可以定义一个 Stock 类。以下是一个 Stock 类的示例:

class Stock:    def __init__(self, name, shares, price):        self.name = name        self.shares = shares        self.price = price    def cost(self):        return self.shares * self.price    def sell(self, shares):        self.shares -= shares

创建多个 Stock 实例并对它们进行操作:

a = Stock('GOOG', 100, 490.10)b = Stock('AAPL', 50, 122.34)c = Stock('IBM', 75, 91.75)stocks = [a, b, c]for s in stocks:    print(f"{s.name} {s.shares} {s.price}")

输出应为:

GOOG 100 490.10AAPL 50 122.34IBM 75 91.75

练习 4.2:添加方法

Stock 类添加 cost()sell() 方法:

a = Stock('GOOG', 100, 490.10)a.cost()  # 49010.0a.sell(25)a.cost()  # 36757.5

练习 4.3:创建实例列表

从文件中读取股票数据并创建实例列表:

import fileparsewith open('Data/portfolio.csv') as lines:    portdicts = fileparse.parse_csv(lines, select=['name', 'shares', 'price'], types=[str, int, float])portfolio = [Stock(d['name'], d['shares'], d['price']) for d in portdicts]

计算总费用:

total_cost = sum(s.cost() for s in portfolio)print(total_cost)  # 44671.15

练习 4.4:使用类

修改 report.py 中的 read_portfolio() 函数,使用 Stock 实例而不是字典。修改后的代码应能正确读取并处理股票数据。


通过这些练习,你将掌握如何通过类定义对象,并为对象添加方法来管理数据。

转载地址:http://qxgkz.baihongyu.com/

你可能感兴趣的文章
PHP文件上传详解
查看>>
PHP文件锁
查看>>
php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
查看>>
PHP时间戳和日期相互转换操作总结
查看>>
php时间戳知识点,php 时间戳函数总结与示例
查看>>
php更新数据库失败,php – 无法更新MySQL数据库
查看>>
php机器人聊天对话框,基于AIML的PHP聊天机器人
查看>>
PHP查找数组中最大值与最小值
查看>>
php查最大值,在PHP数组中查找最大值
查看>>
php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
查看>>
php根据年月日计算年龄
查看>>
RabbitMQ - 单机部署(超详细)
查看>>
php检查注册,PHP检查注册的电子邮件地址是一个’school.edu’地址
查看>>
php模拟发送GET和POST请求
查看>>
RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo
查看>>
php模板引擎smarty
查看>>
php正则表达式模式
查看>>
php正则表达式的特殊字符含义
查看>>
PHP正则表达式获取武汉市的实时pm2.5数据并邮件发送phpmailer
查看>>
RabbitMQ + JMeter组合,优化你的中间件处理方式!
查看>>