zoukankan      html  css  js  c++  java
  • 类和继承和组合

     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

  • 相关阅读:
    C/C++数组名与指针区别深入探索(转)
    mysql 的编译安装
    rpm的问题 ~/.rpmmacros %_rpmlock_path
    GCC中的弱符号与强符号(转)
    关于printf系列函数
    如何修改机器名
    multiple definition of XXXX 的解决
    由无名对象(临时对象)引发的关于“引用”的思考
    关于date中时间字符串的格式
    月薪不同,面试题不同!
  • 原文地址:https://www.cnblogs.com/vigossr/p/10194425.html
Copyright © 2011-2022 走看看