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 -= 110 print('我的位置是:%s - %s'%(self.x, self.y))11 12 class GoldFish(Fish):13 pass14 15 class Shark(Fish):16 def __init__(self):17 #Fish.__init__(self)18 super().__init__()19 #super不需要给出基类/父类的名字,如果有多重继承,20 #则只需要修改引用时的父类名称,不需要每次都修改全部被继承的方法21 self.hungry = True22 23 def eat(self):24 if self.hungry:25 print('Eat it up')26 self.hungry = False27 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