51学通信论坛2017新版

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4631|回复: 0
打印 上一主题 下一主题

[Python语言及其应用] 类的继承

[复制链接]

 成长值: 15613

  • TA的每日心情
    开心
    2022-7-17 17:50
  • 2444

    主题

    2544

    帖子

    7万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    74104
    跳转到指定楼层
    楼主
    发表于 2018-1-1 16:09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       在你编写代码解决实际问题时,经常能找到一些已有的类,它们能够实现你所需的大部分功能,但不是全部。这时该怎么办?当然,你可以对这个已有的类进行修改,但这么做很容易让代码变得更加复杂,一不留神就可能会破坏原来可以正常工作的功能。
       当然,也可以另起炉灶重新编写一个类:复制粘贴原来的代码再融入自己的新代码。但这意味着你需要维护更多的代码。 同时,新类和旧类中实现同样功能的代码被分隔在了不同的地方(日后修改时需要改动多处)。
       更好的解决方法是利用类的继承:从已有类中衍生出新的类, 添加或修改部分功能。这是代码复用的一个绝佳的例子。 使用继承得到的新类会自动获得旧类中的所有方法,而不需要进行任何复制。
       你只需要在新类里面定义自己额外需要的方法, 或者按照需求对继承的方法进行修改即可。修改得到的新方法会覆盖原有的方法。 我们习惯将原始的类称为父类、 超类或基类,将新的类称作孩子类、 子类或衍生类。这些术语在面向对象的编程中不加以区分。
       现在,我们来试试继承。首先,定义一个空类 Car。然后,定义一个 Car 的子类 Yugo。定义子类使用的也是 class 关键词,不过需要把父类的名字放在子类名字后面的括号里(class Yugo(Car)):  

       >>> class Car():
    ... pass
    ...
        >>> class Yugo(Car):
    ... pass
    ...
        接着,为每个类创建一个实例对象:
        >>> give_me_a_car = Car()
        >>> give_me_a_yugo = Yugo()
        子类是父类的一种特殊情况,它属于父类。在面向对象的术语里,我们经常称 Yugo 是一个(is-a) Car。对象 give_me_a_yugo 是 Yugo 类的一个实例,但它同时继承了 Car 能做到的所有事情。当然,上面的例子中 Car 和 Yugo 就像潜艇上的甲板水手一样起不到任何实际作用。我们来更新一下类的定义,让它们发挥点儿作用:
        >>> class Car():
    ... def exclaim(self):
    ... print("I'm a Car!")
    ...
        >>> class Yugo(Car):
    ... pass
    ...
        最后,为每一个类各创建一个对象,并调用刚刚声明的 exclaim 方法:
    >>> give_me_a_car = Car()
    >>> give_me_a_yugo = Yugo()
    >>> give_me_a_car.exclaim()
        I'm a Car!
    >>> give_me_a_yugo.exclaim()
        I'm a Car!
        我们不需要进行任何特殊的操作, Yugo 就自动从 Car 那里继承了 exclaim() 方法。但事实上,我们并不希望 Yugo 在 exlaim() 方法里宣称它是一个 Car,这可能会造成身份危机(无法区分 Car 和 Yugo)。让我们来看看怎么解决这个问题。  
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|51学通信技术论坛

    GMT+8, 2025-1-31 12:43 , Processed in 0.217847 second(s), 28 queries .

    Powered by Discuz! X3

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表