Python入门到精通三天速成第三讲——多重继承
前一讲,你肯定注意到了一个有点奇怪的细节:复数形式的 __bases__ 。前面说过,你可使用它来获悉类的基类,而基类可能有多个。为说明如何继承多个类,下面来创建几个类。
class Calculator:def calculate(self, expression):self.value = eval(expression)class Talker:def talk(self):print('Hi, my value is', self.value)class TalkingCalculator(Calculator, Talker):pass
子类 TalkingCalculator 本身无所作为,其所有的行为都是从超类那里继承的。关键是通过从Calculator 那里继承 calculate ,并从 Talker 那里继承 talk ,它成了会说话的计算器。
>>> tc = TalkingCalculator()
>>> tc.calculate('1 + 2 * 3')
>>> tc.talk()
Hi, my value is 7
这被称为多重继承,是一个功能强大的工具。然而,除非万不得已,否则应避免使用多重继承,因为在有些情况下,它可能带来意外的“并发症”。
使用多重继承时,有一点务必注意:如果多个超类以不同的方式实现了同一个方法(即有多个同名方法),必须在 class 语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的方法。因此,在前面的示例中,如果 Calculator 类包含方法 talk ,那么这个方法将覆盖 Talker类的方法 talk (导致它不可访问)。如果像下面这样反转超类的排列顺序:
class TalkingCalculator(Talker, Calculator): pass
将导致 Talker 的方法 talk 是可以访问的。多个超类的超类相同时,查找特定方法或属性时访问超类的顺序称为方法解析顺序(MRO),它使用的算法非常复杂。所幸其效果很好,你可能根本无需担心。
>>> hasattr(tc, 'talk')
True
>>> hasattr(tc, 'fnord')
False
在上述代码中,你发现 tc (本章前面介绍的 TalkingCalculator 类的实例)包含属性 talk (指向一个方法),但没有属性 fnord 。如果你愿意,还可以检查属性 talk 是否是可调用的。
>>> callable(getattr(tc, 'talk', None))
True
>>> callable(getattr(tc, 'fnord', None))
False
请注意,这里没有在 if 语句中使用 hasattr 并直接访问属性,而是使用了 getattr (它让我能够指定属性不存在时使用的默认值,这里为 None ),然后对返回的对象调用 callable 。
setattr 与 getattr 功能相反,可用于设置对象的属性:
>>> setattr(tc, 'name', 'Mr. Gumby')
>>> tc.name
'Mr. Gumby'
要查看对象中存储的所有值,可检查其 __dict__ 属性。如果要确定对象是由什么组成的,应研究模块 inspect 。这个模块主要供高级用户创建对象浏览器(让用户能够以图形方式浏览Python对象的程序)以及其他需要这种功能的类似程序。
Python入门到精通三天速成第三讲——多重继承相关推荐
- Python入门到精通三天速成第一讲——创建自定义类
class Person:def set_name(self, name):self.name = namedef get_name(self):return self.namedef greet(s ...
- Python入门到精通三天速成第二讲——类与继承
子类扩展了超类(父类)的定义.要指定超类,可在 class 语句中的类名后加上超类名,并将其用圆括号括起. class Filter:def init(self):self.blocked = []d ...
- visual studio 2015 搭建python开发环境,python入门到精通[三]
在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...
- 《Python入门到精通》Python基础语法
「作者主页」:士别三日wyx 此文章已录入专栏<Python入门到精通> 2021最新版Python小白教程,针对0基础小白和基础薄弱的伙伴学习 Python基础语法 1. Hel ...
- python教程吾爱破解_2020年最新python入门到精通教程
2020年最新python入门到精通教程 资源共享吧良心论坛,一直用心为每位会员服务,希望大家能学有所成,今天为大家分享一套2020年最新python入门到精通教程,如果你是0基础想学习python这 ...
- python语法基础语法_Python基本语法[二],python入门到精通[四]
在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...
- python入门容易精通难_我珍藏的一些好的Python代码,技巧
最近后台关注的粉丝越来越多,大部分其实还是偏入门和基础!很多小伙伴加了菜鸟学Python小助手的微信,有一些在问一些入门的问题,有一些在问如何学习Python. 其实Python是入门容易精通难,大家 ...
- Kali Linux 从入门到精通(三)-入侵系统定制
Kali Linux 从入门到精通(三)-入侵系统定制 定制 网络配置 临时IP地址 dhclient eth0 ifconfig eth0 192.168.11/24 route add defau ...
- 《Python入门到精通》文件操作
「作者主页」:士别三日wyx 此文章已录入专栏<Python入门到精通> 2021最新版Python小白教程,针对0基础小白和基础薄弱的伙伴学习 文件操作 1. 打开文件 1.1 ...
最新文章
- 一份整理 | PyTorch是什么,为何选择它
- 10-20国际电极标准系统
- 计算机的世界:[-bit之魂-]
- 营业执照在线一键生成_如何在线制作证件照?证件照一键生成的方法
- flowable 开源项目
- matlab地址数据类型uns,使用matlab生成sine波mif文件
- 帮一个朋友征集算法代码,大家都来开动你的脑袋发挥你的智慧参与吧
- 一起来读you don't know javascript(一)
- 典型计算机控制系统硬件组成框图,计算机控制技术重要.docx
- vue pinyin-match下拉框设置拼音模糊搜索
- 一笔画问题(中国邮递员问题)
- 移动硬盘显示要格式化怎么办?
- 【年终总结】我的2015
- 移动端网站优化需要具备哪些条件
- ubuntu下查看软件安装信息
- C语言程序设计笔记(浙大翁恺版) 第九周:指针
- 【大数据面试题】(五)Spark 相关面试题总结
- 无障碍应用程序:无障碍访问和无障碍入门
- 安装VSCode并打开Git仓库
- 下载stm32f4xx标准外设库