零基础学 Python(2018 版)
尹会生
前游戏公司技术总监,前新浪网技术经理
80141 人已学习
新⼈⾸单¥68
课程目录
已完结/共 72 讲
第一章 :Python介绍和安装 (3讲)
第二章 :Python基础语法 (3讲)
第四章 :条件与循环 (5讲)
第五章 :映射与字典 (2讲)
第六章 :文件和输入输出 (2讲)
第七章 :错误和异常 (1讲)
第九章 :模块 (1讲)
第十章 :语法规范 (1讲)
第十一章 :面向对象编程 (4讲)
第十二章 :多线程编程 (2讲)
第十六章 :综合案例 & 结课测试 (1讲)
特别放送 (1讲)
零基础学 Python(2018 版)
登录|注册
留言
27
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 37 | 类的继承
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | Python语言的特点
02 | Python的发展历史与版本
03 | Python的安装
04 | Python程序的书写规则
05 | 基础数据类型
06 | 变量的定义和常用操作
07 | 序列的概念
08 | 字符串的定义和使用
09 | 字符串的常用操作
10 | 元组的定义和常用操作
11 | 列表的定义和常用操作
12 | 条件语句
13 | for循环
14 | while循环
15 | for循环语句中的if嵌套
16 | while循环语句中的if嵌套
17 | 字典的定义和常用操作
18 | 列表推导式与字典推导式
19 | 文件的内建函数
20 | 文件的常用操作
21 | 异常的检测和处理
22 | 函数的定义和常用操作
23 | 函数的可变长参数
24 | 函数的变量作用域
25 | 函数的迭代器与生成器
26 | Lambda表达式
27 | Python内建函数
28 | 闭包的定义
29 | 闭包的使用
30 | 装饰器的定义
31 | 装饰器的使用
32 | 自定义上下文管理器
33 | 模块的定义
34 | PEP8编码规范
35 | 类与实例
36 | 如何增加类的属性和方法
37 | 类的继承
38 | 类的使用-自定义with语句
39 | 多线程编程的定义
40 | 经典的生产者和消费者问题
41 | Python标准库的定义
42 | 正则表达式库re
43 | 正则表达式的元字符
44 | 正则表达式分组功能实例
45 | 正则表达式库函数match与search的区别
46 | 正则表达式库替换函数sub()的实例
47 | 日期与时间函数库
48 | 数学相关库
49 | 使用命令行对文件和文件夹操作
50 | 文件与目录操作库
51 | 机器学习的一般流程与NumPy安装
52 | NumPy的数组与数据类型
53 | NumPy数组和标量的计算
54 | NumPy数组的索引和切片
55 | pandas安装与Series结构
56 | Series的基本操作
57 | Dataframe的基本操作
58 | 层次化索引
59 | Matplotlib的安装与绘图
60 | 机器学习分类的原理
61 | Tensorflow的安装
62 | 根据特征值分类的模型和代码
63 | 网页数据的采集与urllib库
64 | 网页常见的两种请求方式get和post
65 | HTTP头部信息的模拟
66 | requests库的基本使用
67 | 结合正则表达式爬取图片链接
68 | Beautiful Soup的安装和使用
69 | 使用爬虫爬取新闻网站
70 | 使用爬虫爬取图片链接并下载图片
强势回归:零基础学Python2022版来啦!
71 | 如何分析源代码并设计合理的代码结构&结课测试
本节摘要

课程源码、课件及课后作业地址:

https://gitee.com/geektime-geekbang/geekbangpython

登录 后留言

全部留言(27)

  • 最新
  • 精选
硕杨Sxuya
【严重质疑这一讲的super()讲法】【严重质疑这一讲的super()讲法】【严重质疑这一讲的super()讲法】!!!! 使用方法完全没有讲明白,关键的 super().__init__() 后面一个括号里面的内容由于设计的问题,完全乱了!!!! 后面一个括号传入的是参数值,放到父类去赋值,是有顺序要求的!!!有顺序要求的!!! super().__init__(name) 不是视频里老师带过没有讲明白的意思,如果按照视频里面的表达,代表的意思是“将name初始化”。错的!!!!正确的解读应该是“把输入的name值(按照排列的顺序)传入到父类去进行初始化”!!! 比如 class Monster(): def __init__(self, name, hp=10011): self.name = name self.hp = hp class Boss(Monster): '定义boss的内容,Monster的子类' def __init__(self, name, level, hp=101): super().__init__(hp) self.level = level boss_10 = Boss(name='boss_10', level='99级', hp=900) 代表的意思是:把900(不是默认值)当作第一个参数值传入父类,而父类第一个属性是name,所以这个子类的实例的name就是900了。 比如: class Boss(Monster): '定义boss的内容,Monster的子类' def __init__(self, name, level, hp=101): super().__init__(name,hp) 那么name还是name的值,hp还是hp的值。 但是,如果是: class Boss(Monster): '定义boss的内容,Monster的子类' def __init__(self, name, level, hp=101): super().__init__(hp, name) 那么,name就是hp位置的值,hp就是name位置的值 这一个知识点讲得真的不行。多个参数的东西,怎么能只讲解一个就完事了呢?有顺序的知识不讲,很费解呀!!!

作者回复: 思考的非常细致,非常好,因为有很多条留言,我在这条集中回答一下super的问题。这里我没有展开讲,因为已经大大超过了初学面向对象能够理解的范围。 我在视频里主要希望同学们能够知道子类调用一个父类可以使用普通方法和super()方法两种方法即可 普通方法是 父类.__init__(self) supter方法是 super(子类, self).__init__() 因为super()的使用这里涉及到一个非常复杂的问题,叫做多重继承,在进行重复调用和多继承的时候就会涉及到你所说的查找顺序(MRO)问题 例如B,C类继承A类,D继承B,C 在初始化D类的时候就会初始化两次A类,python语言的解决的方法就是使用super()方法,来解决这个父类被多次初始化的头疼的问题 其他语言诸如java 禁用了多继承,C++使用虚拟机继承 来解决钻石继承的问题。 因此这里不单单要关注__init__()内的顺序问题,还要先学习mro(method resolution order),掌握super()更内在的功能。才能理解他们的顺序问题 此知识点不做展开了,如果对多继承希望透彻的学习建议先掌握mro、钻石继承、新式类的知识和原理

2018-10-01
2
26
space
老师,请教个问题,子类不是可以自动继承父类的属性和方法吗,什么还要使用super调用父类的属性?

作者回复: 为了照顾初学者,我在视频里没有引入多继承的内容,所以造成了你现在的困惑,由于多类继承不是只字片语能说清楚的,我把相关原理和你介绍一下,更具体的内容你可以通过搜索引擎找到答案。 Python中类的继承是这样规定的,子类继承父类,子类就有了父类的属性和方法,那么问题来了,在python中类的初始化都是__init__(), 如果子类初始化时没有这个函数,那么它便代用父类的init,如果实现了,那么就会覆盖父类的初始化函数。那我有没有办法声明的时候直接从父类中找方法呢?这就产生了self和super。他们两个的定义是self首先调用自身的方法,如果没有再去父类中找,super是直接从父类中找方法,那你的程序需要后者就需要super()函数了。 super官方的定义是: super有两个典型的用例。在具有单继承的类层次结构中,super可用于引用父类而不显式命名它们,从而使代码更易于维护。这种用法与其他编程语言中super的使用密切相关。 第二个用例是在动态执行环境中支持协作多重继承。此用例是Python独有的,在静态编译语言或仅支持单继承的语言中找不到。这使得实现“钻石继承”成为可能,其中多个基类实现相同的方法。好的设计要求此方法在每种情况下都具有相同的调用签名(因为调用的顺序是在运行时确定的,因为该顺序适应类层次结构中的更改,并且因为该顺序可以包括在运行时之前未知的兄弟类)。 这是官方文档上对super的解释,我把它翻译成了中文,看看这回对super的理解有没有好一些呢?至于钻石继承我在之前的回复中介绍过,就不重复解释了,它的复杂程度也超过了课程设定的目标,有兴趣可以了解一下。关于super()更多的解释可以参考以下文档: https://www.python.org/dev/peps/pep-3135/

2018-11-18
3
提姆
老师您好,如果都为单一继承,没有两个类同时继承父类是不是就可以考虑不用super().__init,还是建议都使用super呢?

作者回复: 这里可以理解成把父类的__init__()在子类 执行一遍,如果父类有__init__()且需要在子类使用,需要增加super这个方法

2020-06-19
2
深白浅黑
1、在多父类继承情况下,__init__()会从多个父类进行继承,那该如何选择初始化哪个父类的__init__函数。 2、在多次继承的情况下,比如父类有whoami()函数,父类的父类也有whoami()函数,子类如果使用whoami()函数,会使用哪个层次的调用,可控吗?

作者回复: 虽然这两个问题超过了我们的课程内容,但是这两个问题真的相当棒,为你的认真思考点赞。在python中有经典类和新式类两种,我们以新式类为例,依次回答一下你的两个问题 1. 这是多重继承的问题,注意子类定义时圆括号的父类顺序,如果多个父类有相同的方法,并且子类里面没有声明,它会从左至右搜索,结论是子类未定义,按顺序(从左向右)查找父类是否包含该方法,与是不是__init__函数无关。(这里我不先引入super,打乱你的思路,理解了这个概念之后,在搜索引擎再掌握super函数的用法) class FatherA(object): def __init__(self): print("in FatherA") class FatherB(object): def __init__(self): print("in FatherB") class SonC(FatherA, FatherB): pass if __name__ == '__main__': myfunc = SonC() 参考: https://docs.python.org/3/tutorial/classes.html#multiple-inheritance https://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance 2. 这是多层继承的问题,如果子类声明了同名的方法,会覆盖父类的方法,同样的父类声明了方法会覆盖父类的父类声明的方法。 class Father(object): def whoami(self): print("in Father") class Son(Father): def whoami(self): print("in Son") class GrSon(Son): def whoami(self): print("in GrSon") if __name__ == '__main__': myfunc = GrSon() myfunc.whoami() 这里同样不引入super()增加技术负担。我再补充一下多继承还有一个钻石继承的问题。 参考:https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

2018-11-24
1
王玉洁
子类的__init__(self, )入参里面,父类已经有的属性,子类还是要定义吗?

作者回复: 1 子类如果不写__init__(),会自动继承父类的__init__() 2 子类如果重写,实例化子类,就不会调用父类的__init__() 3 一般写法: def __init__(self, 参数): super(父类, self).__init__(参数)

2020-09-01
薛东杰
不知道为什么,照着打,出现这个问题:a1 = Monster(200) TypeError: Monster() takes no arguments

作者回复: 检查一下 Monster的类型,参数

2020-03-26
3
硕果阳光
老师好 这里面讲的多态和Java的概念类似么?

作者回复: 是有区别的,python是动态语言,动态语言调用类的方法不检查类型,只要方法在,参数对就可以调用,如果子类没有这个方法,会去父类查找

2020-01-02
ypine
定义好父类A,属性有name和hp,子类B继承父类时,同时有自己的新属性,怎么显示B类实例化后的具体信息?

作者回复: 试试用dir()

2019-01-31
摇之
老师,面向对象三大特征:多态,抽象,封装。抽象在python里是怎么体现的?

作者回复: python也有一个和java类似抽象类,需要通过abc模块实现。 import abc class My(metaclass=abc.ABCMeta):

2018-12-16
ypine
有个新问题 文件A: # --*-- coding:utf-8 --*-- class Dog(): def __init__(self, name, age): self.name = name self.age = age def run(self): print('%s can run' % self.name.title()) def info(self): print('%s is %s years old' % (self.name.title(), self.age)) def up_age(self, upage): if upage > 0: print('%s is now %s years old' % (self.name, upage + self.age)) def gas_age(self, gasage): if gasage > self.age: self.age = gasage - self.age print('%s is %s years old' % (self.name.title(), self.age)) elif gasage < self.age: print('%s is %s years old' % (self.name.title(), gasage - self.age)) else: print('%s is %s years old' % (self.name.title(), gasage - self.age)) class Hashiqi(Dog): def __init__(self, name, age, ceyes='blue'): super().__init__(name, age) self.ceyes = ceyes def info1(self): print('%s is %s years old, and has %s eyes' % (self.name, self.age, self.ceyes)) if __name__ == '__main__': cat = Dog('apple', 11) cat.run() cat.info() cat.up_age(1) print('\n') hsq = Hashiqi('jiangzi', 6, 'yellow') hsq.info() hsq.gas_age(5) hsq.info1() 执行A都正常 文件B: import 文件A cat =Dog('hasq',111) cat.info() cat.gas_age(11) dog1=Hashiqi('hahaha',90,'yellow') dog1.info1() 报错 AttributeError: 'Hashiqi' object has no attribute 'info1' 求老师解答一下
2019-04-15
3
收起评论