继承
继承指的是类与类之间的关系,是一种什么是什么的关系,
#
# class Paraentclass1:
# pass
#
# class Paraentclass2:
# pass
#
# class SubClass1(Paraentclass1):
# pass
#
# class SubClass(Paraentclass1,Paraentclass2):
# pass
#
# print(SubClass1.__bases__)
# print(SubClass.__bases__)
class Hero:
def __init__(self,nickname,life_value,aggresivity):
self.nickname=nickname
self.life_value=life_value
self.aggresivity=aggresivity
def attack(self,enemy):
enemy.life_value=self.aggresivity
class Garen(Hero):
pass
g1=Garen('GG',20,100)
print(g1.nickname,g1.life_value,g1.aggresivity)
g1.x=1
print(g1.x)
#属性查找小练习
class Foo:
def f1(self):
print('from Foo.f1')
def f2(self):
print('from foo.f2')
self.f1() #b.f1()
class Bar(Foo):
def f1(self):
print('from Bar.f1')
b=Bar()
b.f2()
父类MRO 列表原则:
1、子类会优先于父类
2、多个父类会根据它们在列表中的顺序被检查
3、如果对笑一个类存在两个合法的选择,选择第一个父类
当类是经典类时,多继承情况下,在要查找属性不存在时,会按照深度优先的方式查找下去
当类是新式类时,多继承情况下,在要查找属性不存在时,会按照广度优先的方式查找下去
'''
1、新式类
2、经典类
在python2中-->经典类:没有继承object的类,以及它的子类
'''
# class Foo:
# pass
# class Bar(Foo):
# pass
#在python2中-->新式类:继承object的类,以及它的子类
# class Foo(object):
# pass
# class Bar(Foo):
# pass
#在python3中----> 新式类 一个没有继承object的类,默认就继承object
# class Foo():
# pass
# print(Foo.__bases__)
#验证多继承情况下属性查找
class A(object):
def test(self):
print('from A')
pass
class B(A):
# def test(self):
# print('from B')
pass
class C(A):
# def test(self):
# print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass
class E(C):
# def test(self):
# print('from E')
pass
class F(D,E):
# def test(self):
# print('from F')
pass
#F,D,B,E,C,A
f=F()
f.test()
在子类中重用父类的方法
# 在子类中派生出的新的方法中重用父类的方法,有两种实现方式
#方式一:指明道姓 (不依赖继承)
# 方式二:super() (依赖继承)
# class Hero:
#
# def __init__(self,nickname,life_value,aggresivity):
# self.nickname=nickname
# self.life_value=life_value
# self.aggresivity=aggresivity
#
# def attack(self,enemy):
# enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
# camp='Demacia'
#
# def attack(self,enemy):
# Hero.attack(self,enemy) #指明道姓
# print('from Garen Class')
#
# class Riven(Hero):
# camp='Noxus'
#
# g=Garen('草丛伦',100,30)
# r=Riven('瑞文',100,50)
#
# print(r.life_value)
# g.attack(r)
#
# print(r.life_value)
#
# class Hero:
#
# def __init__(self,nickname,life_value,aggresivity):
# self.nickname=nickname
# self.life_value=life_value
# self.aggresivity=aggresivity
#
# def attack(self,enemy):
# enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
# camp='Demacia'
#
# def __init__(self,nickname,life_value,aggresivity,weapon):
# # self.nickname = nickname
# # self.life_value = life_value
# # self.aggresivity = aggresivity
# Hero.__init__(self, nickname, life_value, aggresivity)
# self.weapon=weapon
#
#
# def attack(self,enemy):
# Hero.attack(self,enemy) #指明道姓
# print('from Garen Class')
#
#
#
# g=Garen('草丛伦',100,30,'金箍棒')
#
# print(g.__dict__)
# 方式二:super() (依赖继承)
# class Hero:
#
# def __init__(self,nickname,life_value,aggresivity):
# self.nickname=nickname
# self.life_value=life_value
# self.aggresivity=aggresivity
#
# def attack(self,enemy):
# enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
# camp='Demacia'
#
# def attack(self,enemy):
# super(Garen, self).attack(enemy) #依赖继承
# print('from Garen Class')
#
# class Riven(Hero):
# camp='Noxus'
#
# g=Garen('草丛伦',100,30)
# r=Riven('瑞文',100,50)
#
# g.attack(r)
# print(r.life_value)
#
# class Hero:
#
# def __init__(self,nickname,life_value,aggresivity):
# self.nickname=nickname
# self.life_value=life_value
# self.aggresivity=aggresivity
#
# def attack(self,enemy):
# enemy.life_value=self.aggresivity
#
#
# class Garen(Hero):
# camp='Demacia'
#
# def __init__(self,nickname,life_value,aggresivity,weapon):
# # self.nickname = nickname
# # self.life_value = life_value
# # self.aggresivity = aggresivity
# super().__init__(nickname,life_value,aggresivity)
# self.weapon=weapon
#
#
# def attack(self,enemy):
# Hero.attack(self,enemy) #指明道姓
# print('from Garen Class')
#
#
#
# g=Garen('草丛伦',100,30,'金箍棒')
#
# print(g.__dict__)
class A:
def f1(self):
print('from A')
super(A, self).f1()
class B:
def f1(self):
print('from B')
class C(A,B):
pass
print(C.mro())
# [<class '__main__.C'>,
# <class '__main__.A'>,
# <class '__main__.B'>,
# <class 'object'>]
c=C()
c.f1()