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()检查列表中所有值是否都为Trueany()检查列表中是否至少有一个值为Truefilter()根据指定条件过滤列表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/Omultiprocessing多进程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/Ocontextlib上下文管理socketserver网络服务框架http.serverHTTP服务框架email邮件处理jsonJSON编码mailcap邮件附件处理mailbox邮件箱mimetypesMIME类型base64Base64编码binhex二进制与十六进制转换binascii二进制与ASCII转换quopri二进制与可打印转换uu二进制与uu编码转换HTMLParserHTML解析html.entitiesHTML实体定义xml.etree.ElementTreeXML解析xml.domXML DOM APIxml.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扩展库