Python模块、JSON与面向对象
最后一篇,整理模块与包、JSON数据处理,还有面向对象的三大特性。面向对象部分内容比较多,慢慢看。
二十一、模块与包
一、什么是模块
Python 模块(Module)就是一个.py文件。模块里可以定义函数、类和变量,也能包含可执行的代码。
模块的作用:Python 中有各种各样的模块,每一个模块都可以帮助我们快速实现某些功能,不用每次都从零写起。
二、模块的导入方式
| 导入方式 | 语法 | 调用方式 | 示例 |
|---|---|---|---|
| 导入整个模块 | import 模块名 | 模块名.功能名() | import time->time.sleep(1) |
| 导入模块中的特定功能 | from 模块名 import 功能名 | 直接使用功能名() | from time import sleep->sleep(1) |
| 导入模块中所有功能(不推荐) | from 模块名 import * | 直接使用功能名() | from time import *->sleep(1) |
| 给模块起别名 | import 模块名 as 别名 | 别名.功能名() | import time as tt->tt.sleep(1) |
| 给功能起别名 | from 模块名 import 功能名 as 别名 | 别名() | from time import sleep as sl->sl(1) |
三、什么是包?
当模块文件越来越多时,我们需要用包来组织和管理它们。
- 从物理上看:包是一个文件夹,里面必须有一个
__init__.py文件(Python 3.3+ 可省略,但建议保留),该文件夹可以包含多个模块文件和子包。 - 从逻辑上看:包的本质依然是模块,可以用来组织一堆功能相近的模块。
- 包的作用:将模块归类,避免命名冲突,方便维护和复用。
四、导入包的方式
# 方式一:导入包中的指定模块importmy_package.module_afrommy_package.module_aimportfunc_name# 方式二:使用 from 包名 import *# 必须在 __init__.py 中定义 __all__ 列表,指定哪些模块可以被导入# my_package/__init__.py# __all__ = ["module_a"] # 只允许导入 module_afrommy_packageimport*module_a.func()# 可用# module_b.func() # 不可用二十二、JSON数据
1. 什么是JSON
JSON是一种轻量级的数据交互格式。按照JSON指定的格式去组织和封装数据。
JSON本质上是一个带有特定格式的字符串。
主要功能:JSON就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。
各种编程语言存储数据的容器不尽相同,在Python中有字典dict这样的数据类型,而其它语言可能没有对应的字典。为了让不同的语言都能够相互通用的互相传递数据,JSON就是一种非常良好的中转数据格式。
2. JSON格式数据
JSON数据有两种形式:
- 类似于字典类型:
{"name": "admin", "age": 18} - 类似于列表类型:
[{"name": "admin", "age": 18}, {"name": "小红", "age": 28}]
3. JSON数据与Python数据的相互转换
importjson# 准备符合JSON格式要求的Python数据data=[{"name":"老王","age":16},{"name":"张三","age":20}]# json.dumps() 将Python数据转化为JSON字符串data_json=json.dumps(data,ensure_ascii=False)print(type(data_json))print(data_json)# json.loads() 将JSON字符串转化为Python数据data_list=json.loads(data_json)print(type(data_list))print(data_list)实际场景:把字典数据保存到文件,下次再读出来
importjson# 保存到文件data={"name":"张三","age":25,"scores":[90,85,92]}withopen("data.json","w",encoding="utf-8")asf:json.dump(data,f,ensure_ascii=False)# 从文件读取withopen("data.json","r",encoding="utf-8")asf:loaded_data=json.load(f)print(loaded_data)二十三、面向对象
1. 什么是面向对象?
面向对象(OOP)是一种编程范式,它把程序看作由"对象"组成,每个对象具有属性(状态)和方法(行为)。
相比传统的面向过程编程,OOP 更强调:
- 封装(Encapsulation):把数据和操作数据的方法绑定在一起,隐藏内部实现
- 继承(Inheritance):子类可以继承父类的属性和方法,代码复用
- 多态(Polymorphism):不同类对象可以使用相同方法名,实现不同功能
2. 类的定义和使用
# 创建类class类名称:类的属性 类的行为# 创建类对象对象=类名称()3. 成员方法的定义语法
def方法名(self,形参1,形参2,...,形参n):方法体""" self关键字是成员方法定义的时候必须填写的 它用来表示类对象自身的意思 当我们使用类对象调用方法时,self会自动被python传入 在方法内部,想要访问类的成员变量,必须使用self """4. 构造方法init:对象初始化
创建对象时若需同时给属性赋值,可使用构造方法。
构造方法__init__在对象创建时自动执行。
规则:
- 方法名固定为
__init__,双下划线开头结尾 - 第一个参数必须是 self
- 通过
self.变量名定义的变量才是成员变量,可在整个对象中使用
classStudent:def__init__(self,name,age):self.name=name self.age=agedefinfo(self):print(f"姓名:{self.name}, 年龄:{self.age}")# 创建对象时传入参数stu=Student("李四",22)stu.info()# 姓名:李四, 年龄:225. 魔术方法
1.str:控制转字符串行为
classPerson:def__init__(self,name):self.name=namedef__str__(self):returnf"Person({self.name})"p=Person("王五")print(p)# 输出:Person(王五) 而不是内存地址2.lt/le/eq:比较运算符
classStudent:def__init__(self,score):self.score=scoredef__lt__(self,other):# < 和 > 都基于此returnself.score<other.scoredef__le__(self,other):# <= 和 >= 都基于此returnself.score<=other.scoredef__eq__(self,other):# == 和 !=returnself.score==other.score s1=Student(90)s2=Student(85)print(s1<s2)# False(90 < 85 为假)print(s1==s2)# False实现了__lt__,对象就可以直接用<、>比较;__le__覆盖<=、>=;__eq__覆盖==、!=。
不实现时,对象间比较的是内存地址。
6. 封装
封装:将事物的属性和行为包装在类中,只暴露需要公开的部分,隐藏内部实现细节。
| 成员类型 | 命名方式 | 访问范围 | 示例 |
|---|---|---|---|
| 公有 | 普通名称 | 类内、类外均可 | self.name |
| 受保护(约定) | 单下划线_ | 类内和子类(约定) | self._age |
| 私有 | 双下划线__ | 仅类内(通过名称修饰) | self.__password |
classPerson:def__init__(self,name,age):self.name=name# 公有属性self.__age=age# 私有属性defeat(self):print("我现在需要吃饭")def__study(self):# 私有方法print("我现在开始学习")per=Person("张三",19)print(per.name)# 张三# print(per.__age) # 报错:AttributeErrorper.eat()# 我现在需要吃饭# per.__study() # 报错,外部无法调用私有方法7. 继承
子类可以继承父类的成员变量和方法(不包含私有成员)
1. 单继承
classAnimal:defeat(self):print("吃东西")classDog(Animal):# Dog继承Animaldefbark(self):print("汪汪")dog=Dog()dog.eat()# 继承父类的方法 -> 吃东西dog.bark()# 汪汪2. 多继承与优先级
Python 支持多继承,当多个父类有同名方法时,按继承顺序从左至右优先(MRO法则)。
classA:definfo(self):print("A")classB:definfo(self):print("B")classC(A,B):# 先继承A,后继承Bpassc=C()c.info()# 输出:A3. 重写(Override)与调用父类方法
classFather:defsay(self):print("Father says")classSon(Father):defsay(self):# 重写print("Son says")# 调用父类的 say 方法super().say()# 或 Father.say(self)son=Son()son.say()# 输出:# Son says# Father says8. 多态
多态指同一个行为,不同的对象表现不同。常配合继承使用:函数参数声明接收父类对象,实际可传入不同子类对象,从而获得不同行为。
classAnimal:defspeak(self):passclassDog(Animal):defspeak(self):print("汪汪")classCat(Animal):defspeak(self):print("喵喵")defanimal_speak(animal):animal.speak()animal_speak(Dog())# 汪汪animal_speak(Cat())# 喵喵9. 抽象类
父类仅定义方法框架,不实现具体功能(用pass),强迫子类必须复写。这种父类称为抽象类,方法称为抽象方法。
classShape:defarea(self):pass# 抽象方法classRectangle(Shape):def__init__(self,w,h):self.w=w self.h=hdefarea(self):returnself.w*self.hclassCircle(Shape):def__init__(self,r):self.r=rdefarea(self):return3.14*self.r**210. 子类访问父类的私有属性和方法
classParent:def__init__(self):self.__secret="私有数据"# 私有属性def__private_method(self):print("父类私有方法被调用")# 提供公有接口访问私有属性defget_secret(self):returnself.__secretdefset_secret(self,value):self.__secret=valueclassChild(Parent):deftest(self):# 通过父类提供的公有方法访问print(self.get_secret())# 输出:私有数据self.set_secret("子类修改了")print(self.get_secret())# 输出:子类修改了# 注意:不能直接 self.__secret,会报错# print(self.__secret) # AttributeErrorc=Child()c.test()以上就是Python基础语法的完整整理,希望能帮到你。