类的继承
一、类分经典类和新式类
1、在python2中,不带(object)的是经典类,带(object)的是新式类
2、在python3中,带和不带(object)都是新式类
3、经典类 的继承查找顺序是 深度优先
4、新式类 的继承查找顺序是 广度优先
# python3.8.3
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D,E):
# def test(self):
# print('from F')
pass
f=F()
f.test()
如果F里面没有test()功能的时候,会先从父类D里面查找,D里面没有就去E里面查找
F.mro() #查看顺序继承
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
重用父类属性或方法
在子类派生出新的方法中重用父类方法,有两种实现方式
1、指名道姓(不依赖继承)
# 指名道姓的方式调用父类功能
class role:
def __init__(self, name, hurt, life_value):
self.name = name
self.hurt = hurt
self.life_value = life_value
def attack(self, name):
name.life_value -= self.hurt
class galen(role):
camp = 'DE Marcia'
def __init__(self, name, hurt, life_value, weapon):
# self.name=name
# self.hurt=hurt
# self.life_value=life_value
role.__init__(self, name, hurt, life_value) #知名道姓,继承父类功能
self.weapon = weapon
def attack(self, name):
role.attack(self, name) # 子类功能中调用父类功能
print('from galen class')
子类功能中调用父类的功能
class role:
def __init__(self, name, hurt, life_value):
self.name = name
self.hurt = hurt
self.life_value = life_value
def attack(self, name):
name.life_value -= self.hurt
class galen(role):
camp = 'DE Marcia'
def attack(self, name):
role.attack(self, name) # 这个就是在子类得功能中调用父类功能
print('from galen class')
2、super() (依赖继承)
class role:
def __init__(self, name, hurt, life_value):
self.name = name
self.hurt = hurt
self.life_value = life_value
def attack(self, name):
name.life_value -= self.hurt
class galen(role):
camp = 'DE Marcia'
def attack(self, name):
# super(galen,self) 括号内第一个参数是自己的类名 逗号 self(对象),这样就可以专门引用父类属性。
super().attack(name) # 绑定方法self就可以不用传,python3后 super括号内可以不写,
print('from galen class')
本文详细解析了Python中类的继承机制,包括经典类与新式类的区别,以及它们的继承查找顺序。通过实例展示了如何在子类中重用父类的属性和方法,包括指名道姓和使用super()两种方式。
315

被折叠的 条评论
为什么被折叠?



