继承
实现代码的重用,子类继承父类的所有方法和属性
1.继承的传递性
子类同时继承父类和父类的父类的所有属性和方法
"""
Dogs类是Animals类的子类,Animals类是Dogs类的父类,Dogs类从Animals类继承
"""
class Animals(object):
name = "动物"
def __init__(self):
self.variety = "界门纲目科属种"
def activity(self):
print("动物都需要进食和休息")
@staticmethod
def fall_in_love():
print("动物都会繁衍后代")
@classmethod
def competition(cls):
print("动物之间存在复杂的食物链关系")
class Dog(Animals):
pass
# 子类继承父类的所有属性和方法
print(Dog.name) # 类属性继承
print(Dog().variety)# 实例属性继承
Dog().activity() # 实例方法继承
Dog.fall_in_love() # 静态方法继承
Dog.competition() # 类方法继承
"""【执行结果】
动物
界门纲目科属种
动物都需要进食和休息
动物都会繁衍后代
动物之间存在复杂的食物链关系
"""
2.方法重写
class Animals(object):
pass
class Dogs(Animals):
def bark(self):
print("汪汪汪")
class KeJi(Dogs):
def bark(self):
print("呜呜呜")
def fly(self):
print("飞飞飞")
no1 = KeJi()
no1.bark()
no1.fly()
3.子类调用父类的方法
super().方法名()
class Animals(object):
def eat(self):
print("吃骨头")
class Dogs(Animals):
def bark(self):
print("汪汪汪")
class KeJi(Dogs):
def bark(self):
print("呜呜呜")
# 调用父类的方法
super().bark()
# 补充其他代码
print("0.0 0.0")
def fly(self):
print("飞飞飞")
no1 = KeJi()
no1.bark()
no1.fly()
4.子类访问父类
子类【不能直接访问】父类的私有属性和私有方法
子类【可以访问】父类的公有方法,可以在【公有方法】中调用私有属性和私有方法
5.多继承
class A:
def test01(self):
print("爸爸A")
class B:
def test02(self):
print("妈妈B")
class C(A,B):
def test03(self):
print("孩子C")
testC = C()
testC.test01()
testC.test02()
testC.test03()
方法冲突
不同的父类,拥有相同的方法名,多继承时,会产生冲突**【尽量避免冲突】**
class A:
def test01(self):
print("爸爸A")
def demo1(self):
print("爸爸A的demo")
class B:
def demo1(self):
print("妈妈B的demo")
def test01(self):
print("妈妈B")
class C(A,B):
def test03(self):
print("孩子C")
testC = C()
testC.test01()
testC.demo1()
mro机制
MRO是 method resolution order ,主要用于在多继承时,判断方法属性的调用路径
__mro__ 是python的内置属性,针对类专门提供的
class A:
def test01(self):
print("爸爸A")
def demo1(self):
print("爸爸A的demo")
class B:
def demo1(self):
print("妈妈B的demo")
def test01(self):
print("妈妈B")
class C(B,A):
def test03(self):
print("孩子C")
testC = C()
testC.test01()
testC.demo1()
# C的属性和方法的继承顺序,从左至右
print(C.__mro__)
super().init()
子类继承父类的初始化方法
class F(object):
cls_attr = "F的类属性"
def __init__(self):
self.example_attr = "F的实例属性"
@staticmethod
def staticmethod_func():
print("F的静态方法")
@classmethod
def classmethod_func(cls):
print("F的类方法")
def example_func(self):
print("F的实例方法")
class S(F):
def __init__(self,S_attr="S的实例属性"):
self.S_attr = S_attr
# python2.X 写为super(S,self).__init__()
super().__init__()
print(S.__dict__)
S().example_func()# 无返回值,返回None
print(S().example_attr)
print(S().S_attr)
print(S.cls_attr)
S.classmethod_func()# 无返回值,返回None
S.staticmethod_func()# 无返回值,返回None
class F(object):
cls_attr = "F的类属性"
def __init__(self,name):
self.name = name
self.example_attr = "F的实例属性"
class S(F):
def __init__(self,name,S_attr="S的实例属性"):
self.S_attr = S_attr
# python2.X 写为super(S,self).__init__()
super(S,self).__init__(name)
f = F("147")
print(f.name)
s = S("258")
print(s.name)
执行结果
妈妈B
妈妈B的demo
# 解释器从左至右,查找对象的方法和属性
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
上帝类
class A(object):
pass
class B:
pass
a = A()
b = B()
print(dir(a))
print(dir(b))
python 3.x 中没有父类时,默认继承自object类
python 2.x 中没有父类时,不会继承object类
多态
不同的子类对象,调用相同的父类方法,产生不同的结果
class Dog(object):
def __init__(self,name):
self.name = name
def game(self):
print(f"{self.name}在玩耍")
class XiaoTianDog(Dog):
def game(self):
print(f"{self.name}翱翔天际")
class Person(object):
def __init__(self,name):
self.name = name
def game_with_dog(self,dog):
print(f"{self.name}和{dog.name}在玩耍")
print(type(dog))
dog.game()
WangCai = Dog("旺财")
ErLangShen = Person("杨戬")
ErLangShen.game_with_dog(WangCai)
print("*"*30)
WangCai = XiaoTianDog("飞天狗")
ErLangShen = Person("杨戬")
ErLangShen.game_with_dog(WangCai)
结果
杨戬和旺财在玩耍
<class '__main__.Dog'>
旺财在玩耍
******************************
杨戬和飞天狗在玩耍
<class '__main__.XiaoTianDog'>
飞天狗翱翔天际