多继承:
python的类可以有两个以上父类,也即有类A,类B,类C。C同时继承类A与类B,此时C中可以使用A与B中的属性与
方法。那么问题来了,如果A与B中具有相同名字的方法,这个时候python怎么调用的会是哪个方法呢?
若为多继承,那么当多个父类中有重复的属性或者方法时,子类的调用结果会含糊不清
多继承顺序。(mro 解析顺序)
继承树:print(D.__mro__) 输出D的继承顺序
super()里面传入参数可以指定继承谁的方法,注意self不能少;
这里的super(A,self).play()是继承的在继承数中A的下一个类的play方法。这里
super(A,self).play()指的是B的play方法;
子类调用父类的__init__方法:
和类有关的几个函数
判断对象object是否包含名为name的特性
得到对象的某个属性值 (获取器) 调用函数返回内存地址,加括号就可以直接执行
不存在就报错,调用属性就返回属性的值
getattr(t, 'a', 'not find') 第三个报错的内容,即t这个对象里没有属性a
setattr() 给对象添加某个属性值 (设置器 )
属性不存在就添加,属性存在就修改,可以用dir()查看是否添加了属性
对一个实例设置,其他实例不会改变。如果设置类属性,则实例都会变。
delattr() 删除对象属性 (删除器)
类属性只能用类删除,实例属性只能用实例删除
isinstance() 检查对象是否是类的对象,返回True或False
issubclass() 检查一个类是否是另一个类的子类。返回True或False
#类属性:
__dict__ # 类的属性(包含一个字典,由类的数据属性组成)
__doc__ # 类的文档字符串
#类方法:
__init__ # 初始化
__repr__ # 直接返回这个对象 repr() 函数就是调用对象的这个方法
__str__ # print(obj) 如果类里面定义了__repr__,没有定义__str__ print(obj)也会返回__repr__的内容,或者说__repr__的优先级更高
__call__ # Obj() 使实例可被调用
#运算符方法
__add__(self,other) #x+y
__sub__(self,other) #x-y
__mul__(self,other) #x*y
__mod__(self,other) #x%y
__iadd__(self,other) #x+=y
__isub__(self,other) #x-=y
__radd__(self,other) #y+x
__rsub__(self,other) #y-x
__imul__(self,other) #x*=y
__imod__(self,other) #x%=y
#讲魔法方法,主要是为了让大家,了解python面向对象的设计模式,并不是让你们实现每一个魔法方法。
清澈的爱,只为中国