类和继承和组合

 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 #这不是继承,是组合
View Code

 把没有关系的类进行组合,可以避免继承的一些问题

##############################

mixin:

https://fishc.com.cn/thread-48888-1-1.html

原文地址:https://www.cnblogs.com/vigossr/p/10194425.html