1 import random as r 2 3 class Fish: 4 def __init__(self): 5 self.x = r.randint(0,10) 6 self.y = r.randint(0,10) 7 8 def move(self): 9 self.x -= 1 10 print('我的位置是:%s - %s'%(self.x, self.y)) 11 12 class GoldFish(Fish): 13 pass 14 15 class Shark(Fish): 16 def __init__(self): 17 #Fish.__init__(self) 18 super().__init__() 19 #super不需要给出基类/父类的名字,如果有多重继承, 20 #则只需要修改引用时的父类名称,不需要每次都修改全部被继承的方法 21 self.hungry = True 22 23 def eat(self): 24 if self.hungry: 25 print('Eat it up') 26 self.hungry = False 27 else: 28 print('Full')
注意如果子类Shark()引用父类Fish()时,如果不使用super()函数,则Shark()子类产生的对象时没法调用move()方法的,因为不存在x,y参数
使用super()函数,则可以move(),而且只需要指出父类的方法,不需要self。
如果有多重继承,则只需要修改Shark(Fish)中的Fish名称,不需要修改super()函数内的方法名,super()函数会自动找到父类的方法。
“super函数超级之处在于你不需要明确给出任何基类的名字,它会自动帮你找出所有积累以及对应的方法。由于不用给出基类的名字,这就意味着你如果改变了类继承关系,只要改变class语句里的父类即可,而不必在代码中修改所有被继承的方法”
另一个例子:
1 class A(): 2 def __init__(self): 3 print('进入A') 4 print('离开A') 5 6 class B(A): 7 def __init__(self): 8 print('进入B') 9 #A.__init__(self) 10 super().__init__() 11 print('离开B') 12 13 class C(A): 14 def __init__(self): 15 print('进入C') 16 #A.__init__(self) 17 #super().__init__() 18 print('离开C') 19 20 class D(B,C): 21 def __init__(self): 22 print('进入D') 23 #B.__init__(self) 24 #C.__init__(self) 25 super().__init__() 26 print('离开D') 27 28
d=D()会出现什么呢?
##############################
组合:
1 class Turtle: 2 def __init__(self,x): 3 self.num = x 4 5 class Fish: 6 def __init__(self,x): 7 self.num = x 8 9 class Pool: 10 def __init__(self, x, y): 11 self.turtle = Turtle(x) 12 self.fish = Fish(y) 13 def print_num(self): 14 print('水池里共有%d只乌龟,%d只鱼'%(self.turtle.num, self.fish.num)) 15 #这就是组合,把一个类的对象,放到另一个类里引用 16 #这不是继承,是组合
把没有关系的类进行组合,可以避免继承的一些问题
##############################
mixin:
https://fishc.com.cn/thread-48888-1-1.html