• ~~核心编程(四):面向对象——单继承&复写~~


    进击のpython

    *****

    继承


    继承的出现!就是一个作用!

    为了节省代码!

    为什么说节省代码?

    你爸爸要是王健林

    你是不是就不用愁怎么获得钱了?

    为啥?

    是不是钱已经有了!

    直接拿来用就行了!

    我们想一下奥

    狗和人是不是都会吃东西?

    那么吃东西这个东西是不是算是他俩的共有属性?

    那我就可以把这个吃东西当作父类,让人和狗继承

    # -*- coding: utf-8 -*-
    # @Time    : 2019.07.16
    # @Author  : 爪爪
    # @Url     : https://www.cnblogs.com/jevious/
    
    class Animals:
    
        def __init__(self, name, old):
            self.name = name
            self.old = old
            print(f"{name},{old}岁")
    
    
    class Dog(Animals):  # 是不是原先都是没写的??现在就是有用的了!
        pass
    
    
    class Person(Animals):
        pass
    
    
    p = Person("zhangsan", 18)
    
    d = Dog("ponny", 10)
    

    以前Dog类后面不是没有括号嘛?

    这回有了!括号里是他继承的父类

    可以看出来,尽管Dog里面没有函数体

    但是也看到了,执行了父类的代码

    所以也就看到了继承了父类吧!

    同时不光继承父类,也能够有自己的方法调用!

    # -*- coding: utf-8 -*-
    # @Time    : 2019.07.16
    # @Author  : 爪爪
    # @Url     : https://www.cnblogs.com/jevious/
    
    class Animals:
    
        def __init__(self, name, old):
            self.name = name
            self.old = old
            print(f"{name},{old}岁")
    
    
    class Dog(Animals):
        pass
    
    
    class Person(Animals):
    
        def info(self):
            print(f"{self.name}是个人!")
    
    
    p = Person("zhangsan", 18)
    
    d = Dog("ponny", 10)
    
    p.info()
    

    • 属性&方法重写

      比如说我们在刚才的父类里定义了动物类型是哺乳动物,因为哺乳动物占大多数嘛

      但是有些动物就不是哺乳动物,我们继承了父类,那这个哺乳动物的这个属性

      也就跟着过来了,我们想要修改他

      很容易,只需要在特殊动物上自己重新定义就行

      # -*- coding: utf-8 -*-
      # @Time    : 2019.07.16
      # @Author  : 爪爪
      # @Url     : https://www.cnblogs.com/jevious/
      
      class Animals:
          a_type = "哺乳"
      
          def __init__(self, name, old):
              self.name = name
              self.old = old
      
              print(f"{name},{old}岁,是{self.a_type}动物")
      
      
      class Dog(Animals):
          pass
      
      
      class Person(Animals):
      
          def info(self):
              print(f"{self.name}是个人!")
      
      
      class Snack(Animals):
          a_type = "冷血动物"
          pass
      
      
      p = Person("zhangsan", 18)
      s = Snack("sheshe", 2)
      d = Dog("ponny", 10)
      
      zhangsan,18岁,是哺乳动物
      sheshe,2岁,是冷血动物动物
      ponny,10岁,是哺乳动物
      

      同理,方法也可以这样重写

      # -*- coding: utf-8 -*-
      # @Time    : 2019.07.16
      # @Author  : 爪爪
      # @Url     : https://www.cnblogs.com/jevious/
      
      class Animals:
          a_type = "哺乳"
      
          def __init__(self, name, old):
              self.name = name
              self.old = old
      
              print(f"{name},{old}岁,是{self.a_type}动物")
      
          def info(self):
              print(f"{self.name}是个{self.a_type}动物!")
      
      
      class Dog(Animals):
          pass
      
      
      class Person(Animals):
      
          def info(self):
              print(f"{self.name}是个人!")
      
      
      class Snack(Animals):
          a_type = "冷血动物"
      
          def info(self):
              print(f"我是{self.name}的父类重写")
      
          pass
      
      
      p = Person("zhangsan", 18)
      s = Snack("sheshe", 2)
      d = Dog("ponny", 10)
      
      d.info()
      
      p.info()
      
      s.info()
      
      zhangsan,18岁,是哺乳动物
      sheshe,2岁,是冷血动物动物
      ponny,10岁,是哺乳动物
      ponny是个哺乳动物!
      zhangsan是个人!
      我是sheshe的父类重写
      

      我的Snack类觉得你父类里面的info方法写的不好

      我想自己重新写一个

      所以就在自己的类里重新写上这个方法

      重新定义(--init--也可以这么搞)

      也可以看出来

      当属性相同或者方法相同的时候

      以子类为准!


    • 同时执行子类&父类方法

      那我有没有另外的一种情况

      我Snack觉得你父类的info方法写的挺好,但是还不够好

      我不修改你,我想在你的基础上再加点

      怎么做呢?

      # -*- coding: utf-8 -*-
      # @Time    : 2019.07.16
      # @Author  : 爪爪
      # @Url     : https://www.cnblogs.com/jevious/
      
      class Animals:
          a_type = "哺乳"
      
          def __init__(self, name, old):
              self.name = name
              self.old = old
      
              print(f"{name},{old}岁,是{self.a_type}动物")
      
          def info(self):
              print(f"{self.name}是个{self.a_type}动物!")
      
      
      class Snack(Animals):
          a_type = "冷血动物"
      
          def info(self):
              Animals.info(self) # 在这呢!
              print(f"我是{self.name}的父类重写")
      
          pass
      
      
      s = Snack("sheshe", 2)
      
      s.info()
      
      sheshe,2岁,是冷血动物动物
      sheshe是个冷血动物动物!
      我是sheshe的父类重写
      

      办法就是我先调用一下你父类的这个方法

      然后我再继续写,这样就会先打印父类的,再打印你新加的东西

      注意奥,要把self参数传进去


      那好了,我又想起了他 --init--

      我要是想再加个参数怎么做呢?

      例如:

      这是原先父类的(self, name, old)

      我想在我的Snack里变成(self, name, old,sex)

      怎么搞(直接加的是可以的,不用说了)

      还是可以向上面一样,先调用父类,再继续

      # -*- coding: utf-8 -*-
      # @Time    : 2019.07.16
      # @Author  : 爪爪
      # @Url     : https://www.cnblogs.com/jevious/
      
      class Animals:
          a_type = "哺乳"
      
          def __init__(self, name, old):
              self.name = name
              self.old = old
      
              print(f"{name},{old}岁,是{self.a_type}动物")
      
          def info(self):
              print(f"{self.name}是个{self.a_type}动物!")
      
      
      class Snack(Animals):
          a_type = "冷血动物"
      
          def __init__(self, name, old, sex):
              Animals.__init__(self, name, old)  # 看这里!!!
              self.sex = sex
      
          def info(self):
              Animals.info(self)
              print(f"我是{self.name}的父类重写")
              print(f"这是我的性别{self.sex}")
      
          pass
      
      
      s = Snack("sheshe", 2, "man")  # 这里就要传三个参数
      
      s.info()
      
      sheshe,2岁,是冷血动物动物
      sheshe是个冷血动物动物!
      我是sheshe的父类重写
      这是我的性别man
      

      当然,你也会发现,这么写,稍微有点笨

      所以在Py3中,我们可以用一个函数来解决这个问题!

      super()(以前讲的,说面向对象再讲,有印象吧

      怎么用呢?

      # -*- coding: utf-8 -*-
      # @Time    : 2019.07.16
      # @Author  : 爪爪
      # @Url     : https://www.cnblogs.com/jevious/
      
      class Animals:
          a_type = "哺乳"
      
          def __init__(self, name, old):
              self.name = name
              self.old = old
      
              print(f"{name},{old}岁,是{self.a_type}动物")
      
          def info(self):
              print(f"{self.name}是个{self.a_type}动物!")
      
      
      class Snack(Animals):
          a_type = "冷血动物"
      
          def __init__(self, name, old, sex):
              # Animals.__init__(self, name, old)  # 看这里!!!
              super(Snack, self).__init__(name, old)  # 看这里!!!
              self.sex = sex
      
          def info(self):
              Animals.info(self)
              print(f"我是{self.name}的父类重写")
              print(f"这是我的性别{self.sex}")
      
          pass
      
      
      s = Snack("sheshe", 2, "man")  # 这里就要传三个参数
      
      s.info()
      

      super这里面啊应该写上你当前子类的名字(Snack)和 self

      然后 . 一下,后面是你要修改的方法,去掉self,只留下形参

      但是啊,这个人的记性啊,是真的差!怎么办呢?

      程序猿就为了能更简单一点!

      就有了如下的写法:

      # -*- coding: utf-8 -*-
      # @Time    : 2019.07.16
      # @Author  : 爪爪
      # @Url     : https://www.cnblogs.com/jevious/
      
      class Animals:
          a_type = "哺乳"
      
          def __init__(self, name, old):
              self.name = name
              self.old = old
      
              print(f"{name},{old}岁,是{self.a_type}动物")
      
          def info(self):
              print(f"{self.name}是个{self.a_type}动物!")
      
      
      class Snack(Animals):
          a_type = "冷血动物"
      
          def __init__(self, name, old, sex):
              # Animals.__init__(self, name, old)  # 看这里!!!
              # super(Snack, self).__init__(name, old)  # 看这里!!!
              super().__init__(name, old)  # 看这里!
              self.sex = sex
      
          def info(self):
              Animals.info(self)
              print(f"我是{self.name}的父类重写")
              print(f"这是我的性别{self.sex}")
      
          pass
      
      
      s = Snack("sheshe", 2, "man")  # 这里就要传三个参数
      
      s.info()
      

      更简单了是吧!

      所以知道选哪个了吧!

      别跟我说是不是只有--init--能用super

      咋的啊?--init-- 多个啥啊?

      不是函数啊!

      这个函数都能用

      别的函数凭啥不能用?


    *这是单继承*
    *多继承在后面*
  • 相关阅读:
    引擎设计跟踪(九.10) Max插件更新,地形问题备忘
    引擎设计跟踪(九.9) 文件包系统(Game Package System)
    [原] Android上使用native IO
    [原] GLES在iOS和Android上的不同
    [原] perforce 获取本地最近更新的Changelist
    [转]GLES 3.0 新特性
    [原]android不支持命名的semaphore
    [原]android 链接错误
    引擎设计跟踪(九.8) Gizmo helper实现与多国语言
    [原]游戏引擎与游戏逻辑
  • 原文地址:https://www.cnblogs.com/jevious/p/11193406.html
Copyright © 2020-2023  润新知