多继承和MRO顺序
我们需要注意的是在进行多继承的时候,要是直接通过父类名.属性的方式进行继承父类的方法,会造成多继承问题,菱形继承的二义性问题,菱形继承就是指一个子类继承自多个父类,也被称为钻石继承。会产生一个明显的产生多继承的父类的构造方式被执行了两次,为了解决这个问题,Python官方采用了一个算法将复杂结构上所有的类全部映射到一个线性顺序上,而根据这个顺序就能保证所有的类只会被构造一次,这个顺序就是MRO顺序。
MRO顺序(使用线性顺序解决菱形继承中的二义性问题,保证每个类都出现一次)
查看MRO顺序:
类名.__mro__()
类名.mro()
实现mro顺序可以使用super来调用父类的属性。
super的本质是调用当前类在mro顺序的下一个类。不一定就是当前类的父类。
property属性
property属性的作用是将一个属性的操作方法封装为一个属性,用户用起来就和操作普通属性一样简单。
定义property属性的方式主要有两种,分别是装饰器和类属性,装饰器方式针对新式类和旧式类有区别。
装饰器:
新式类中具有三种,可以根据器属性的访问特点,分别将三个方法定义为同一个属性:获取(@property),修改(@property.setter),删除(@property.deleter)。
类属性方式:
property方法中有个四个参数 !!
第一个参数是方法名,调用 对象.属性 时自动触发执行方法
第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
魔法方法和介绍
__doc__:表示类的描述信息
__module__:表示当前操作的对象在哪个模块中
__class__:表示当前操作对象的类是什么
__init__:初始化方法,通过类创建对象时自动调用
__del__:当对象在内存中被释放是,自动调用
__call__:init魔法方法是通过创建对象时触发(对象=类名());而对于call魔法方法的执行是对象后加括号实现的,即(对象()或者类名()())
__dict__:类或者对象中的所有属性
__str__:如果在类中定义了一个str方法,那么在打印对象时,默认输出该方法的返回值。
getitem、setitem、delitem:用于索引操作,分别表示获取,设置,删除数据。
class Foo( ):
def __getitem__(self, key):
print(\'__getitem__\', key)
def __setitem__(self, key, value):
print(\'__setitem__\', key, value)
def __delitem__(self, key):
print(\'__delitem__\', key)
obj = Foo()
result = obj[\'k1\'] # 自动触发执行 __getitem__
obj[\'k2\'] = \'laotie\' # 自动触发执行 __setitem__
del obj[\'k1\'] # 自动触发执行 __delitem__
上下文管理器:
任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器协议。
那么文件对象是如何实现这两个方法的呢?我们可以模拟实现一个自己的文件类,让该类实现 enter() 和 exit() 方法。
class File():
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
print(\"entering\")
self.f = open(self.filename, self.mode)
return self.f
def __exit__(self, *args):
print(\"will exit\")
self.f.close()
enter() 方法返回资源对象,这里就是你将要打开的那个文件对象,exit() 方法处理一些清除工作。
因为 File 类实现了上下文管理器,现在就可以使用 with 语句了。
with File(\'out.txt\', \'w\') as f:
print(\"writing\")
f.write(\'hello, python\')
这样,你就无需显示地调用 close 方法了,由系统自动去调用,哪怕中间遇到异常 close 方法也会被调用。
除此之外,Python还提供了一个contentmanager的装饰器,更进一步的简化了上下文管理器的实现方式,通过yield将函数分为2部分,yield之前的语句在__enter__方法中执行,yield之后的方法在__exit__方法中执行,紧跟在yield之后的是函数的返回值。
from contextlib import contextmanager
@contextmanager
def my_open(path, mode):
f = open(path, mode)
yield f
f.close()
调用
with my_open(\'out.txt\', \'w\') as f:
f.write(\"hello , the simplest context manager\")
继续阅读与本文标签相同的文章
上一篇 :
专利申请三板斧 “抡”清楚了不愁不成功
下一篇 :
腾讯做了一件好事
-
2019 年度 “CCF 杰出会员” 公布,清华北大等86人当选
2026-05-18栏目: 教程
-
3步轻松搞定Spring Boot缓存
2026-05-18栏目: 教程
-
5G机皇已来 三星Galaxy Note10+5G正式登陆中国
2026-05-18栏目: 教程
-
威特动力:从“制造”到“智造”的跨越
2026-05-18栏目: 教程
-
Nreal携手运营商KDDI,共推日本MR生态建设
2026-05-18栏目: 教程
