1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
############################继承
#父类里面有的,子类里面再写一次. 叫做重写 ,只会用子类的了,父类的就屏蔽了
#继承是通过查找来找的, 不是变量空间的复制, 还是独立的变量空间
# 多继承 既不是广度也不是深度搜索 . mro() 方法,是在类里面的,他会自己计算出搜索顺序 例如: print(Magician.mro())或print(Magician.__mro__) 或者 print(s.__class__.mro())
# [<class '__main__.Magician'>, <class '__main__.Role'>, <class 'object'>]
# super 自己找父类, 如果父类改变,也不需要修改,哪怕父类被更换,也不用担心了! super不需要再传self ,super是通过mro查找的
#__bases__特殊属性 print(Role.__bases__) 打印出来是一个元组 (<class 'object'>,)
#实例+() 自动调用__call__方法
class Role:
def __init__(self,name,level,blood): # 在实例化之后自动被调用,用来进行初始化
self.name = name
self.level = level
self.blood = blood
def __repr__(self):
return "{cls}:{name},{level},{blood}".format(cls=self.__class__.__name__,
name=self.name,
level=self.level,
blood=self.blood )
def figth(self):
raise NotImplementedError('必须在子类中实现该行为')
class SwordsMan(Role): #继承了Role类
def __init__(self,name,level,blood,attack_power): #重写了__init__
#Role.__init__(self,name,level,blood)
super().__init__(name, level, blood) #不在明确指定类名
self.attack_power = attack_power
def fight(self):
print('物理攻击')
class Magician(Role): #继承自Role
def __init__(self,name,level,blood,magical_power): #重写了__init__
#Role.__init__(self,name,level,blood)
super().__init__(name, level, blood) # 不在明确指定类名
self.magical_power = magical_power
def fight(self):
print('魔法攻击')
def cure(self):
print('治疗')
## 鸭子类型
#展示出攻击的效果(这件事,不属于任何一个角色)
#写出一个函数
def draw_fight(role): # 鸭子类型体现出来是,一个函数,所关心的不是类型,而是行为
print('role', end='')
role.fight() # 其实并不关心,role是不是一个role实例
class GirlFriend: #虽然没有继承Role类,依然可以用鸭子类型
def __init__(self,name):
self.name = name
def fight(self):
print('拔电源攻击')
g = GirlFriend('xxx')
draw_fight(g) #打印出role拔电源攻击
s= SwordsMan('xps',18,3000,150) #实例化
m = Magician('ps',18,1400,6660)
draw_fight(s) #打印出 role物理攻击
draw_fight(m) #打印出 role魔法攻击
print(s)
print(m.__repr__())
print('***********************************************************')
# 继承是通过查找来找的, 不是变量空间的复制, 而是独立的变量空间
class BaseClass:
attribute = 1
def method(self):
pass
class DerivedClass: # 简单继承,没有任何的封装与重写
pass
print(DerivedClass.__dict__) # DerivedClass中没有 attribute 与 method
print(BaseClass.__dict__) # BaseClass中有
print(Magician.__mro__)
print(s.__class__.mro())
|