Python3基础教程:类、模块、异常处理与文件操作详解

周末不加班
周末不加班
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍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')

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或工作具有一定的参考借鉴价值。如有疑问欢迎留言交流,感谢支持。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表