专栏首页思考的代码世界Python编程从入门到实践之继承|第11天
原创

Python编程从入门到实践之继承|第11天

User:你好我是森林 Date:2018-03-24 Mark:《Python从入门到实践》 原文:https://www.jianshu.com/p/829b102f178f

继承

编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

子类的方法__init__()

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。我们直接在上一节的汽车类基础上添加一个ElectricCar类,让它继承Car类。

class ElectricCar(Car):
    # 电动汽车
    def __init__(self,name,model,year):
        # 初始化父类的属性
        super().__init__(name,model,year)
        
# 示例化
my_car = ElectricCar('dian', 'models', 2019)
print(my_tesla.get_descriptive())

super()是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超 类(superclass),super因此而得名。

给子类定义属性和方法

让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。和之前的定义属性和方法的逻辑类似,不做过多的阐述。可以理解为在子类里面可以自定义一些自己需要的方法或者属性。

重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。或者可以理解为在子类里面可以重写一个新的方法,重新赋值一个新的属性等。通俗的理解为:“取其精华,去其糟粕”。

将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文 件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大 型类拆分成多个协同工作的小类。

导入类

导入单个类

为了使项目代码的可读性更加高,使用该模块的程序都必须使用更具体的文件名。例如my_car.py。导入的方法和之前类似,具体语法结构如下:

from model_name import Class_name

采用improt语句让Python打开模块car,并导入其中的Car类,剩下的就可以使用了。

导入类是一种有效的编程方式。如果在这个程序中包含了整个Car类,它该有多长呀!通过 将这个类移到一个模块中,并导入该模块,你依然可以使用其所有功能,但主程序文件变得整洁而易于阅读。

在一个模块中存储多个类

也就是一个模块中可以有多个类,例如父类和子类。假设my_car.py有两个类,一个是父类Car,另一个是子类ElectricCar,那么在导入该模块时,可以选择导入某一个类。

代码示例:

from model_name import Class_name

现在就可以进行示例化或者其他的操作了。

从一个模块中导入多个类

和我们之前导入函数的时候原理一样,我们可以导入任意数量的类。导入模块多个类的时候,采用逗号拼接即可。语法如下:

from model_name import Class_name0, Class_name1

导入之后,就可根据需要创建每个类的任意数量的实例。

导入整个模块

导入整个模块的语法也特别的简单,具体如下:

import model_name

这样就可以使用整个模块的任意类。

导入模块中的所有类

导入多个就用逗号一个个区分,然后倒入所有的就用*代替。所以语法如下:

from model_name import * 

引用原文。

不推荐使用这种导入方式,其原因有二。首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类,将大有裨益;但这种导入方式没有明确地指出你使用了模块中的哪些类。这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其 他东西同名的类,将引发难以诊断的错误。这里之所以介绍这种导入方式,是因为虽然不推荐使 用这种方式,但你可能会在别人编写的代码中见到它。

需要从一个模块中导入很多类时,最好导入整个模块,并使用module_name.class_name语法来访问类。这样做时,虽然文件开头并没有列出用到的所有类,但你清楚地知道在程序的哪些地方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。

在一个模块中导入另一个模块

有时候,需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。在这种情况下,可在前一个模块中导入必要的类。

这部分的笔记实在是比较简单,没有过多的代码,逻辑上的问题基本在之前都涉及过了。如果不是特别了解,可以看看之前的文章,或者可以关注我,后续将继续更新。

欢迎你免费加入我的星球,一起分享,共同成长。

知识星球

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python基础学习08天

    你好我是森林
  • Python网络数据之用爬虫测试网站|第11天

    你好我是森林
  • 微信使用小技巧

    你好我是森林
  • Python3快速入门(四)——Pyth

    Python中使用包管理模块,包通常对应一个目录,必须在目录下创建一个init.py模块,init.py模块的模块名称即为包名,Python才会将目录解析为包。...

    py3study
  • 你连Nginx怎么转发给你请求都说不清楚,还好意思说自己不是CRUD工程师?

    Nginx由内核和模块组成,Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block...

    程序员小强
  • 【游戏开发】浅谈游戏开发中常见的设计原则

      俗话说得好:“设计模式,常读常新~”。的确,每读一遍设计模式都会有些新的体会和收获。马三不才,才读了两遍设计模式(还有一遍是在学校学的),属于菜鸟级别的。这...

    马三小伙儿
  • Maven聚合模块与继承和Maven的生命周期

    因为Maven是提倡模块化编程的,所以会以多个工程分为多个模块。如果所有的功能、模块都写在一个工程里的话,不方便于扩展、升级、修改、查看和团队开发,而且也不方便...

    端碗吹水
  • R语言可视化操作数据挖掘

    今天给大家介绍一个在R语言中实现了可视化的操作界面的包rattle。此包主要用来实现数据的挖掘的相关功能。首先我们看下包的安装:

    一粒沙
  • Android使用Jenkins自动化构建测试打包apk

    Jenkins这东西搭建起来真是一点也不省心啊,看着别人的教程摸着石头过河,配置的东西有点多啊,稍有不慎,就构建不成功啦!即使步骤跟别人一样也会报各种乱七八糟的...

    Zachary46
  • Aibee融资1.65亿元 曾16.8万元秒下aibee.cn

    近日,原百度研究院院长林元庆创立的行业升级AI整体解决方案公司Aibee (爱笔智能) 宣布获得1.65亿元人民币天使轮融资。本轮融资由昆仲资本领投...

    躲在树上的域小名

扫码关注云+社区

领取腾讯云代金券