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