多继承及魔术方法介绍
Posted urls
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多继承及魔术方法介绍相关的知识,希望对你有一定的参考价值。
多继承的弊端会造成菱形继承这种情况,找不清调用顺序
super对象按照mro列表的顺序依次调用,解决菱形继承存在的问题
经典类:深度优先 (python2.x)
新式类:广度优先 (python3.x)
写多继承时,尽量避免造成不同类相同方法名的情况,提高代码质量 高内聚,低耦合
高内聚:一个模块只完成一个任务,专一性高
低耦合:模块与模块之间可以彼此独立不冲突,方便移植复用.
super调用父类方法
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序
魔术方法(特定时机自动触发)
#__init__魔术方法(构造方法)
\'\'\'
触发时机:实例化对象,初始化的时候触发
功能:为对象添加成员
参数:参数不固定,至少一个self参数
返回值:无
\'\'\'
示例:
# (1) 基本语法 class MyClass(): def __init__(self): print("构造方法被触发 ... ") self.color = "屎黄色" # 实例化对象 obj = MyClass() print(obj.__dict__) print(obj.color) # (2) 带有多个参数的构造方法 class MyClass(): def __init__(self,color): self.color = color # 实例化对象 obj1 = MyClass("狗屎绿") print(obj1.color) obj2 = MyClass("粉嫩红") print(obj2.color) # (3)类可以是一个,对象可以是多个,创造的对象彼此是独立的; class Children(): def __init__(self,name,skin): self.name = name self.skin = skin def cry(self): print("小孩一下生久哇哇哇的哭") def la(self): print("小孩一下生久拉粑粑") def __eat(self): print("小孩一下生就要吃奶奶..") def info(self): print("小孩的名字:{},小孩的肤色{}".format(self.name,self.skin)) def info2(self,name,skin): print("小孩的名字:{},小孩的肤色{}".format(name,skin)) # 实例化对象 afanda = Children("阿凡达","深蓝色") afanda.cry() afanda.info() haoke = Children("绿巨人","绿色的") haoke.la() haoke.info() wangbaoqiang = Children("王宝强","亮绿色") wangbaoqiang.info() # wangbaoqiang.__eat() error wangbaoqiang.info2("张保张","黄色")
#__new__ 魔术方法
\'\'\'
触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
功能:控制对象的创建过程
参数:至少一个cls接受当前的类,其他根据情况决定
返回值:通常返回对象或None
\'\'\'
#__del__ 魔术方法(析构方法)
\'\'\'
触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候]
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无
\'\'\'
#__call__ 魔术方法
\'\'\'
触发时机:把对象当作函数调用的时候自动触发
功能: 模拟函数化操作
参数: 参数不固定,至少一个self参数
返回值: 看需求
\'\'\'
#__str__ 魔术方法
\'\'\'
触发时机: 使用print(对象)或者str(对象)的时候触发
功能: 查看对象
参数: 一个self接受当前对象
返回值: 必须返回字符串类型
\'\'\'
#__repr__ 魔术方法
\'\'\'
触发时机: 使用repr(对象)的时候触发
功能: 查看对象,与魔术方法__str__相似
参数: 一个self接受当前对象
返回值: 必须返回字符串类型
\'\'\'
#----普通变量的基本操作,如果应用在对象上,也有相应的魔术方法
#__bool__ 魔术方法
\'\'\'
触发时机:使用bool(对象)的时候自动触发
功能:强转对象
参数:一个self接受当前对象
返回值:必须是布尔类型
\'\'\'
\'\'\'
类似的还有如下等等(了解):
__complex__(self) 被complex强转对象时调用
__int__(self) 被int强转对象时调用
__float__(self) 被float强转对象时调用
...
...
\'\'\'
#__add__ 魔术方法 (与之相关的__radd__ 反向加法)
\'\'\'
触发时机:使用对象进行运算相加的时候自动触发
功能:对象运算
参数:二个对象参数
返回值:运算后的值
\'\'\'
\'\'\'
类似的还有如下等等(了解):
__sub__(self, other) 定义减法的行为:-
__mul__(self, other) 定义乘法的行为:
__truediv__(self, other) 定义真除法的行为:/
...
...
\'\'\'
#__len__ 魔术方法
\'\'\'
触发时机:使用len(对象)的时候自动触发
功能:用于检测对象中或者类中某个内容的个数
参数:一个self接受当前对象
返回值:必须返回整型
\'\'\'
\'\'\'
类似的还有如下等等(了解):
__iter__(self) 定义迭代容器中的元素的行为
__reversed__(self) 定义当被 reversed() 调用时的行为
__contains__(self, item) 定义当使用成员测试运算符(in 或 not in)时的行为
...
...
\'\'\'
以上是关于多继承及魔术方法介绍的主要内容,如果未能解决你的问题,请参考以下文章