跳到主要内容

9. 类

类的定义

class Dog:
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age

def sit(self):
"""模拟小狗被命令时蹲下"""
print(f"{self.name} is now sitting.")

def roll_over(self):
"""模拟小狗被命令时打滚"""
print(f"{self.name} rolled over!")

my_dog = Dog('willie', 6)
print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")
my_dog.sit()
my_dog.roll_over()

init()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。

我们将方法定义成三个形参:self、name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。我们创建Dog实例时,Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。

继承

class Car:
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0

def get_descriptive_name(self):
"""返回整洁的描述性信息"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()

def read_odometer(self):
"""打印一条指出汽车里程的消息"""
print(f"This car has {self.odometer_reading} miles on it.")

def update_odometer(self, mileage):
"""
将里程表读数设置为指定的值
禁止将里程表读数往回调
"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!")

def increment_odometer(self, miles):
"""将里程表读数增加指定的量"""
self.odometer_reading += miles

class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""
初始化父类的属性
再初始化电动汽车特有的属性
"""
super().__init__(make, model, year)
self.battery_size = 75

def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print(f"This car has a {self.battery_size}-kWh battery.")

def fill_gas_tank(self):
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")

my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
my_tesla.fill_gas_tank()
  • 子类的方法__init__()接受创建Car实例所需的信息
  • super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名。
  • 电动汽车还有一个属性(电瓶),其中存储了有关电瓶的信息。我们添加了一个新方法describe_battery(),它打印有关电瓶的信息。
  • 方法fill_gas_tank()并非Car类的标准方法,因此它不会被继承。如果我们在Car实例中调用这个方法,Python将无法找到它,因此它只能在ElectricCar实例中使用。

导入类

from car import Car

my_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

其他导入方式:

  • 导入整个模块
  • 导入模块中的特定类
  • 导入整个模块,再使用句点表示法访问需要的类
  • 从一个模块中导入多个类
from car import Car, ElectricCar
  • 导入整个模块
  • 导入模块中的所有类
from car import *

需要从一个模块导入很多类时,最好导入整个模块,并使用句点表示法访问需要的类。这样做时,虽然文件开头并没有列出用到的每个类,但你清楚地知道在程序的哪些地方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。

  • 在一个模块中导入另一个模块

Python标准库

Python标准库是一组模块,安装的Python都包含它。你现在对类的工作原理已有大致的了解,可以开始使用其他程序员编写好的代码了。可使用标准库中的任何函数和类,为此只需在程序开头包含一条简单的import语句。

常用内置函数

  • range()生成一系列数字
  • list()将range()的结果直接转换为列表
  • min()返回最小值
  • max()返回最大值
  • sum()返回总和
  • sorted()返回排序后的列表副本
  • len()返回列表长度
  • enumerate()返回索引和值
  • zip()返回元组列表
  • reversed()返回反转后的列表副本
  • all()检查列表中所有值是否都为True
  • any()检查列表中是否至少有一个值为True
  • filter()根据指定条件过滤列表
  • map()根据指定条件对列表中的每个元素进行操作
  • reduce()对列表中的元素进行累积操作
  • eval()计算存储在字符串中的有效Python表达式,并返回一个对象
  • exec()执行存储在字符串中的Python语句
  • open()打开文件
  • isinstance()检查对象是否为指定类的实例
  • issubclass()检查类是否为指定类的子类
  • callable()检查对象是否可调用
  • dir()返回包含对象所有属性和方法的列表
  • help()返回对象的帮助文档
  • id()返回对象的内存地址
  • input()接受用户输入
  • print()打印输出
  • type()返回对象的类型

常用内置模块

  • math数学运算
  • random生成随机数
  • datetime处理日期和时间
  • time处理时间
  • calendar处理日历
  • collections扩展的容器数据类型
  • itertools提供用于操作迭代对象的函数
  • functools函数式编程工具
  • operator函数形式的操作符
  • string字符串常量
  • re正则表达式
  • os操作系统相关
  • sys系统相关
  • jsonJSON编码和解码
  • base64Base16, Base32, Base64, Base85数据编码
  • picklePython对象序列化
  • sqlite3SQLite数据库
  • hashlib加密算法
  • hmac加密相关
  • logging日志相关
  • logging.config日志配置相关
  • urllibURL处理模块
  • httpHTTP协议相关模块
  • webbrowser调用浏览器
  • xmlXML处理模块
  • htmlHTML处理模块
  • xmlrpcXML-RPC服务器和客户端模块
  • socket网络通信
  • asyncio异步I/O
  • multiprocessing多进程
  • subprocess子进程管理
  • threading多线程
  • queue队列
  • copy拷贝
  • multiprocessing多进程
  • subprocess子进程管理
  • threading多线程
  • queue队列
  • copy拷贝
  • shutil高级文件操作
  • gzipgzip压缩
  • tarfiletar压缩
  • csvCSV文件操作
  • configparser配置文件操作
  • zipfileZIP压缩
  • timeit性能度量
  • profile性能分析
  • cProfile性能分析
  • trace代码跟踪
  • pdbPython调试器
  • unittest单元测试
  • doctest文档测试
  • argparse命令行选项与参数解析
  • getopt命令行选项与参数解析
  • logging日志模块
  • concurrent并发执行
  • asyncio异步I/O
  • contextlib上下文管理
  • socketserver网络服务框架
  • http.serverHTTP服务框架
  • email邮件处理
  • jsonJSON编码
  • mailcap邮件附件处理
  • mailbox邮件箱
  • mimetypesMIME类型
  • base64Base64编码
  • binhex二进制与十六进制转换
  • binascii二进制与ASCII转换
  • quopri二进制与可打印转换
  • uu二进制与uu编码转换
  • HTMLParserHTML解析
  • html.entitiesHTML实体定义
  • xml.etree.ElementTreeXML解析
  • xml.domXML DOM API
  • xml.saxSAX解析
  • xml.parsers.expatExpat解析器
  • imghdr图像文件头检测
  • audioop音频处理
  • aifcAIFF音频处理
  • sunauSUN AU音频处理
  • waveWAV处理
  • chunk二进制数据块处理
  • colorsys颜色系统转换
  • imputil导入工具
  • pyclbr类浏览
  • tabnanny空格和制表符检测
  • py_compile编译Python源文件
  • compileall编译Python源文件
  • dis反汇编Python字节码
  • picklePython对象序列化
  • pickletoolsPython对象序列化
  • formatter通用数据格式化
  • msilibMSI数据库
  • msvcrtMS VC++运行库
  • winregWindows注册表
  • winsound声音播放
  • posixPOSIX系统调用
  • pwd密码数据库
  • spwd影子密码数据库
  • grp组数据库
  • cryptUNIX密码加密
  • termiosPOSIX终端控制
  • tty终端控制
  • pty伪终端控制
  • fcntl文件描述符控制
  • pipes管道接口
  • resource资源使用
  • nisUNIX网络信息系统
  • syslogUNIX syslog日志
  • commandsUNIX命令
  • urlparseURL解析
  • cgiCGI处理
  • cgitbCGI脚本回溯
  • wsgirefWSGI参考实现
  • urllibURL处理模块
  • urllib2URL处理模块
  • httplibHTTP客户端和服务器
  • ftplibFTP客户端
  • poplibPOP3客户端
  • imaplibIMAP4客户端
  • nntplibNNTP客户端
  • smtplibSMTP客户端
  • smtpdSMTP服务器
  • telnetlibTelnet客户端
  • uuidUUID对象
  • socket套接字
  • sslTLS/SSL包装套接字
  • asyncore异步套接字处理
  • asynchat异步套接字处理
  • signal信号处理
  • mmap内存映射文件
  • readlineGNU readline接口
  • rlcompleterGNU readline接口
  • cmd命令行解析器
  • shlex简单词法分析器
  • tkinterTk接口
  • tkinter.tixTk扩展
  • tkinter.ttkTk主题
  • tkinter.scrolledtextTk文本滚动条
  • tkinter.messageboxTk消息框
  • tkinter.colorchooserTk颜色选择器
  • tkinter.commondialogTk公共对话框
  • tkinter.filedialogTk文件对话框
  • tkinter.fontTk字体定义
  • tkinter.turtleTk turtle图形
  • tkinter.dndTk拖放操作
  • tkinter.ttkcalendarTk日历
  • tkinter.ttkcomboboxTk组合框
  • tkinter.ttkentryTk输入框
  • tkinter.ttkframeTk框架
  • tkinter.ttklabelframeTk标签框架
  • tkinter.ttkmenubuttonTk菜单按钮
  • tkinter.ttknotebookTk记事本
  • tkinter.ttkpanedwindowTk窗格
  • tkinter.ttkprogressbarTk进度条
  • tkinter.ttkseparatorTk分隔符
  • tkinter.ttksizegripTk大小控制
  • tkinter.ttktreeviewTk树视图
  • tkinter.ttkscrollbarTk滚动条
  • tkinter.ttkcomboboxTk组合框
  • tkinter.ttkentryTk输入框
  • tkinter.ttkframeTk框架
  • tkinter.ttklabelframeTk标签框架
  • tkinter.ttkmenubuttonTk菜单按钮
  • tkinter.ttknotebookTk记事本
  • tkinter.ttkpanedwindowTk窗格
  • tkinter.ttkprogressbarTk进度条
  • tkinter.ttkseparatorTk分隔符
  • tkinter.ttksizegripTk大小控制
  • tkinter.ttktreeviewTk树视图
  • tkinter.ttkscrollbarTk滚动条
  • idlelibIDLE集成开发环境

常用第三方库

  • requestsHTTP库
  • scrapy爬虫框架
  • beautifulsoupHTML/XML解析器
  • seleniumWeb自动化测试框架
  • pymysqlMySQL数据库驱动
  • pymongoMongoDB数据库驱动
  • redisRedis数据库驱动
  • pillow图像处理库
  • pyquery网页解析库
  • jieba中文分词库
  • numpy科学计算库
  • pandas数据分析库
  • matplotlib数据可视化库
  • scipy科学计算库
  • sympy符号计算库
  • pygame游戏开发库
  • pyopenglOpenGL开发库
  • pyglet游戏开发库
  • pyqtGUI开发库
  • wxpythonGUI开发库
  • djangoWeb开发框架
  • flaskWeb开发框架
  • tornadoWeb开发框架
  • jupyter交互式笔记本
  • pyinstaller打包工具
  • py2exe打包工具
  • py2app打包工具
  • cx_freeze打包工具
  • pywin32Windows扩展库
  • pywinrmWindows远程管理库
  • pywin32Windows扩展库