目录
1、封装:
封装是指隐藏类的实现环节,让使用者不在关系这些细节,从而达到通过尽可能少的方法或属性去操作对象。
1.1、封装的方式:
python类中以双下划线(__
)开头,不以双下划线结尾的标识符为私有成员,私有成员只能使用方法来进行访问和修改
-
以
__
开头的属性为类的私有属性,在子类和类外部无法直接使用 -
以
__
开头的方法为私有方法,在子类和类外部无法直接调用
2、多态
多态是指在有继承关系的类中,调用基类对象的方法,实际能调用之类覆盖基类的现象。
多态调用的方法与对象有关,不予类型相关,py中所有的对象都只有“运行时状态”
2.1、面向对象的三大特征:继承、封装、多态
3、super()函数
- super() 函数是用于调用父类(超类)的一个方法。
- super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
- super() 方法的语法:
在子类方法中可以使用super().add()调用父类中已被覆盖的方法
可以使用super(Child, obj).myMethod()用子类对象调用父类已被覆盖的方法
3.1、super().init()
super().__init__()
是 Python 中用于调用父类(基类)构造函数的一种方式。它通常用于子类的构造函数中,以确保父类的构造函数被正确调用和初始化。这在继承(inheritance)中尤为重要,因为父类的初始化代码可能包含设置实例变量或执行其他重要的初始化任务。
4、迭代器与生成器
4.1、迭代器
什么是迭代器
-
迭代器是访问可迭代对象的工具
-
迭代器是指用 iter(obj) 函数返回的对象(实例)
-
迭代器可以用next(it)函数获取可迭代对象的数据
迭代器函数iter和next
函数 | 说明 |
---|---|
iter(iterable) | 从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象 |
next(iterator) | 从迭代器iterator中获取下一个记录,如果无法获取一下条记录,则触发 StopIteration 异常 |
迭代器说明
-
迭代器只能往前取值,不会后退
-
用iter函数可以返回一个可迭代对象的迭代器
4.2、生成器
生成器是在程序运行时生成数据,与容器不同,它通常不会在内存中保留大量的数据,而是现用现生成。
-
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
-
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
-
每次使用 yield 语句生产一个值后,函数都将暂停执行,等待被重新唤醒。
-
yield 语句相比于 return 语句,差别就在于 yield 语句返回的是可迭代对象,而 return 返回的为不可迭代对象。
-
然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。
生成器有两种
-
生成器函数
-
生成器表达式
#yield 语句的语法
yield 表达式
5、函数式编程
定义:用一系列函数解决问题。
-
函数可以赋值给变量,赋值后变量绑定函数。
-
允许将函数作为参数传入另一个函数。
-
允许函数返回一个函数。
5.1、函数作为参数
-
将核心逻辑传入方法体,使该方法的适用性更广。
5.1.1、lambda表达式
# 定义:
变量 = lambda 形参: 方法体
# 调用:
变量(实参)
5.1.2、内置高阶函数
常用内置高价函数示例
class Gril:
list_gril = []
def __init__(self, name,socre, age,height):
self.name = name
self.socre = socre
self.age = age
self.height = height
Gril.list_gril.append(self)
def __str__(self):
return f"{self.name},{self.socre},{self.age},{self.height}"
gril01 = Gril("阿轲", 100, 23, 170)
gril02 = Gril("苏荃", 92, 32, 166)
gril03 = Gril("双儿", 90, 25, 192)
gril04 = Gril("芳姑", 80, 28, 153)
gril05 = Gril("方怡", 75, 17, 156)
gril06 = Gril("曾柔", 67, 24, 164)
#print(gril01)
#打印所有对象,map函数
for em in map(lambda item:item.name,Gril.list_gril):
print(em)
# 打印所有颜值大于80的对象
for en in filter(lambda item:item.socre > 80,Gril.list_gril):
print(en)
#打印年龄最大的对象信息
print(max(Gril.list_gril,key=lambda item:item.age))
#打印年龄最小的对象信息
print(min(Gril.list_gril,key=lambda item:item.age))
#按颜值升序排列
for en in sorted(Gril.list_gril,key = lambda item:item.socre,reverse=True):
print(en)
#按颜值降序排列
for en in sorted(Gril.list_gril,key = lambda item:item.socre,reverse=False):
print(en)
5.2、函数作为返回值
5.2.1、闭包
-
闭包是指引用了此函数外部嵌套函数的变量的函数 闭包就是能够读取其他函数内部变量的函数。只有函数内部的嵌套函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数,同时这个函数又引用了外部的变量“。
-
在本质上,闭包是将内部嵌套函数和函数外部的执行环境绑定在一起的对象。
5.2.1.1、闭包三要素
-
必须有一个内嵌函数
-
内嵌函数必须引用外部函数中变量
-
外部函数返回值必须是内嵌函数。
5.2.1.2、闭包的优缺点
1、优点
1. 逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。 2. 方便调用上下文的局部变量。 3. 加强封装性,是第2点的延伸,可以达到对变量的保护作用。
2、使用闭包的注意点(缺点)
1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包 2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
5.2.2、装饰器
什么是装饰器
-
装饰器是一个函数,主要作用是来用包装另一个函数或类
装饰器的作用:
-
在不修改被装饰的函数的源代码,不改变被装饰的函数的调用方式的情况下添加或改变原函数的功能。
函数装饰器的语法:
def 装饰器函数名(fn):
语句块
return 函数对象
@装饰器函数名 <换行>
def 被装饰函数名(形参列表):
语句块
基本装饰器:有参数的函数装饰器
def mydeco(fn):
def fx():
print("====这是myfunc被调用之前====")
ret = fn()
print("----这是myfunc被调用之后====")
return ret
return fx
@mydeco
def myfunc():
print("myfunc被调用.")
myfunc()
myfunc()
myfunc()
带参数的 装饰器
装饰器链
类装饰器