Python3基础教程:类、模块、异常处理与文件操作详解
本文详细介绍Python3中的核心概念,包括类的定义与继承、模块的导入与作用域、错误异常的捕获处理以及文件的读写操作。通过具体代码示例,讲解命名规范、pip安装第三方库、JSON编解码及文件编码处理,帮助开发者快速掌握Python3基础编程技巧。
相较于Python 2.7的旧版教程,本版本增加了以下新内容:
- 新增命名关键字参数的使用方法;
- 新增StringIO和BytesIO模块的使用;
- 新增datetime模块的使用;
- 新增urllib模块的使用;
- 新增枚举类型的使用;
- 新增virtualenv虚拟环境的使用;
- 新增asyncio异步编程;
- 新增aiohttp异步HTTP编程;
- 实战Web应用已完全基于asyncio重写。
本文将深入解析Python3中类、模块、错误与异常以及文件操作的相关知识,供读者参考学习。接下来直接切入主题,详细介绍以下内容。
类
面向对象设计的核心在于Class(类)的抽象性与Instance(实例)的具体性。例如,“学生”是一个抽象的Class,而“张三”、“李四”则是具体的Instance。
定义
Class命名采用大驼峰命名法。若为内部使用的Class,名称前通常加一个下划线。
类定义的一般格式如下:
class Student: pass # 或者 class Developer(object): pass
object表示该类继承自哪个父类,object是最终的父类。
class Developer(object):
# 定义类属性
name = 'WuXiaolong'
site = 'http://wuxiaolong.me/'
# 变量名两个下划线开头,定义私有属性, 这样在类外部无法直接进行访问,类的私有方法也是如此
__sex = 0
# 定义构造方法
def __init__(self, name, site, sex):
self.name = name
self.site = site
self.__sex = sex
# 类方法
def get_sex(self):
return self.__sex
def set_sex(self, sex):
self.__sex = sex
# 调用:
if __name__ == '__main__':
# 实例化类
developer = Developer('wxl', 'http://wuxiaolong.me/', 1) # 实例化成变量
print(developer.site, developer.get_sex()) # 访问类的属性和方法
注意:以单下划线开头的变量或方法表示protected(保护)类型,即保护类型。这类成员仅允许其本身与子类访问,不能通过from module import *导入。
单继承
class Developer(object):
# 定义类属性
name = 'WuXiaolong'
site = 'http://wuxiaolong.me/'
# 变量名两个下划线开头,定义私有属性, 这样在类外部无法直接进行访问,类的私有方法也是如此
__sex = 0
# 定义构造方法
def __init__(self, name, site, sex):
self.name = name
self.site = site
self.__sex = sex
# 类方法
def get_sex(self):
return self.__sex
def set_sex(self, sex):
self.__sex = sex
# 单继承
class AndroidCoder(Developer):
coder_id = 1024
# 定义构造方法
def __init__(self, name, site, sex, coder_id):
# 调用父类构造方法
# Developer.__init__(self, name, site, sex) # 老办法
super(AndroidCoder, self).__init__(name, site, sex) # 采用新式
self.coder_id = coder_id
# 重写父类的方法
def set_sex(self, sex):
self.__sex = sex
print('这是个秘密')
def get_sex(self):
return self.__sex
# 调用:
if __name__ == '__main__':
# 单继承
androidCoder = AndroidCoder('wxl', 'http://wuxiaolong.me/', 1, 520)
print(androidCoder.set_sex(2))
注意:使用super进行继承时,要求最顶层的父类必须继承自object,这样才能利用super()函数调用父类的__init__()等方法。
多继承
假设B继承A,C继承B
以单继承为例,AndroidCoder继承了Developer,现在让PythonCoder继承AndroidCoder:
# 多继承,B 继承 A,C 继承 B
class PythonCoder(AndroidCoder):
# 定义构造方法
def __init__(self, name, site, sex, coder_id):
# 调用父类构造方法
super(PythonCoder, self).__init__(name, site, sex, coder_id)
# 调用:
if __name__ == '__main__':
pythonCoder = PythonCoder('wxl', 'http://wuxiaolong.me/', 1, 1024)
print(androidCoder.get_sex())
注意:多继承中圆括号内父类的顺序很重要。若父类中有相同的方法名,而在子类中未明确指定,Python会调用子类的实现;
Z继承X、Y
class JavaCoder(object):
java_id = 1
# 定义构造方法
def __init__(self, java_id):
self.java_id = java_id
print('来自JavaCoder')
class FullStackCoder(AndroidCoder, JavaCoder):
# 定义构造方法
def __init__(self, name, site, sex, coder_id):
# 调用父类构造方法
super(FullStackCoder, self).__init__(name, site, sex, coder_id)
JavaCoder.__init__(self, coder_id) # 这里需要使用老办法
# 调用:
if __name__ == '__main__':
fullStackCoder = FullStackCoder('wxl', 'http://wuxiaolong.me/', 1, 1024)
模块
Python的模块概念与Java中的包类似,通过import语句导入。
import语句
例如,在类环节新建的文件名为wxl_class.py,想在另一个文件中使用:
## 导入模块
import wxl_class
developer = wxl_class.Developer('wxl', 'http://wuxiaolong.me/', 1) # 实例变量
print(developer.site)
问题:发现打印了两次,原来wxl_class.py中没有写__name__属性。
__name__属性
每个模块都有一个__name__属性,当其值为'__main__'时,表明该模块自身正在运行。因此在wxl_class.py中加上__main__判断即可解决重复执行的问题。
if __name__ == '__main__': pass
from…import语句
从模块导入指定内容,或者使用*代表导入全部内容:
from wxl_def import hello1 m = hello1(666, 999)
作用域
正常的函数和变量名是公开的(public),可以直接引用;
以两个下划线开头,定义私有(private),这样在类外部无法直接访问;
以单下划线开头的表示的是protected类型的变量,即保护类型,只能允许其本身与子类进行访问,不能用于from module import *。
标准库
Python本身携带一些标准的模块库,例如json模块。
在Python3中,可以使用json模块对JSON数据进行编解码,它包含了两个主要函数:
json.dumps():对数据进行编码;
json.loads():对数据进行解码。
JSON类型与Python类型的对应关系如下:

import json
# Python 字典类型转换为 JSON 对象
python_data = {'id': 1024, 'name': 'wxl', 'site': 'http://wuxiaolong.me/'}
print(json.dumps(python_data)) # 打印:{"id": 1024, "name": "wxl", "site": "http://wuxiaolong.me/"}
# 将 JSON 对象转换为 Python 字典
json_data = '{"id": 1024, "name": "wxl", "site": "http://wuxiaolong.me/"}'
print(json.loads(json_data)) # 打印:{'id': 1024, 'name': 'wxl', 'site': 'http://wuxiaolong.me/'}
第三方模块
在Python中,安装第三方模块是通过包管理工具pip完成的。
1、安装pip
sudo easy_install pip
2、例如安装PyMySQL模块来连接数据库,Python 3.x环境下:
pip3 install PyMySQL
返回结果:
Collecting PyMySQL Using cached PyMySQL-0.7.11-py2.py3-none-any.whl Installing collected packages: PyMySQL Successfully installed PyMySQL-0.7.11
将pip升级到最新版本
python -m pip install --upgrade pip
错误和异常
Java中捕获异常使用try-catch-finally,而Python使用try…except…finally…:
try:
name = 'wxl'
print(int(name))
except ValueError as e: # 所有的错误类型都继承自BaseException
print(e)
finally:
print('finally')
文件
Python内置了读写文件的函数,一般分为3步:
1、open()函数,打开一个文件对象;
2、调用read()方法读取文件内容;
3、调用close()方法关闭文件。
写文件
在桌面新建一个空白Python3Learn.txt文件:
def write_file():
try:
f = open('/Users/wuxiaolong/Desktop/Python3Learn.txt', 'w') # 标示符'w'表示写
f.write('Hello, Python')
except BaseException as e:
print(e)
finally:
if f:
f.close()
读文件
def read_file():
try:
f = open('/Users/wuxiaolong/Desktop/Python3Learn.txt', 'r') # 标示符'r'表示读
# print(f.read()) # read()会一次性读取文件的全部内容
print(f.readlines()) # 每次读取一行内容,返回list
except BaseException as e:
print(e)
finally:
if f:
f.close()
读取二进制文件
例如图片、视频等,在桌面上随便找一张Python3Learn.png:
def read_byte_file():
try:
f = open('/Users/wuxiaolong/Desktop/Python3Learn.png', 'rb') # 标示符'rb'表示读
print(f.read()) # read()会一次性读取文件的全部内容
# print(f.readlines()) # 每次读取一行内容,返回list
except BaseException as e:
print(e)
finally:
if f:
f.close()
字符编码
encoding参数用于读取非UTF-8编码的文本文件;errors参数用于处理编码错误,最简单的方式是直接忽略。
f = open('/Users/wuxiaolong/Desktop/Python3Learn.txt', 'r', encoding='gbk', errors='ignore')
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或工作具有一定的参考借鉴价值。如有疑问欢迎留言交流,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













