前一讲,你肯定注意到了一个有点奇怪的细节:复数形式的 __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入门到精通三天速成第三讲——多重继承相关推荐

  1. Python入门到精通三天速成第一讲——创建自定义类

    class Person:def set_name(self, name):self.name = namedef get_name(self):return self.namedef greet(s ...

  2. Python入门到精通三天速成第二讲——类与继承

    子类扩展了超类(父类)的定义.要指定超类,可在 class 语句中的类名后加上超类名,并将其用圆括号括起. class Filter:def init(self):self.blocked = []d ...

  3. visual studio 2015 搭建python开发环境,python入门到精通[三]

    在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...

  4. 《Python入门到精通》Python基础语法

    「作者主页」:士别三日wyx   此文章已录入专栏<Python入门到精通>   2021最新版Python小白教程,针对0基础小白和基础薄弱的伙伴学习 Python基础语法 1. Hel ...

  5. python教程吾爱破解_2020年最新python入门到精通教程

    2020年最新python入门到精通教程 资源共享吧良心论坛,一直用心为每位会员服务,希望大家能学有所成,今天为大家分享一套2020年最新python入门到精通教程,如果你是0基础想学习python这 ...

  6. python语法基础语法_Python基本语法[二],python入门到精通[四]

    在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...

  7. python入门容易精通难_我珍藏的一些好的Python代码,技巧

    最近后台关注的粉丝越来越多,大部分其实还是偏入门和基础!很多小伙伴加了菜鸟学Python小助手的微信,有一些在问一些入门的问题,有一些在问如何学习Python. 其实Python是入门容易精通难,大家 ...

  8. Kali Linux 从入门到精通(三)-入侵系统定制

    Kali Linux 从入门到精通(三)-入侵系统定制 定制 网络配置 临时IP地址 dhclient eth0 ifconfig eth0 192.168.11/24 route add defau ...

  9. 《Python入门到精通》文件操作

    「作者主页」:士别三日wyx   此文章已录入专栏<Python入门到精通>   2021最新版Python小白教程,针对0基础小白和基础薄弱的伙伴学习 文件操作 1. 打开文件 1.1 ...

最新文章

  1. 一份整理 | PyTorch是什么,为何选择它
  2. 10-20国际电极标准系统
  3. 计算机的世界:[-bit之魂-]
  4. 营业执照在线一键生成_如何在线制作证件照?证件照一键生成的方法
  5. flowable 开源项目
  6. matlab地址数据类型uns,使用matlab生成sine波mif文件
  7. 帮一个朋友征集算法代码,大家都来开动你的脑袋发挥你的智慧参与吧
  8. 一起来读you don't know javascript(一)
  9. 典型计算机控制系统硬件组成框图,计算机控制技术重要.docx
  10. vue pinyin-match下拉框设置拼音模糊搜索
  11. 一笔画问题(中国邮递员问题)
  12. 移动硬盘显示要格式化怎么办?
  13. 【年终总结】我的2015
  14. 移动端网站优化需要具备哪些条件
  15. ubuntu下查看软件安装信息
  16. C语言程序设计笔记(浙大翁恺版) 第九周:指针
  17. 【大数据面试题】(五)Spark 相关面试题总结
  18. 无障碍应用程序:无障碍访问和无障碍入门
  19. 安装VSCode并打开Git仓库
  20. 下载stm32f4xx标准外设库

热门文章

  1. 资产分池中的量化实战
  2. Pandas高级操作
  3. BZOJ1354: [Baltic2005]Bus Trip
  4. blongsTo 用法
  5. ubuntu16.04--cuda
  6. factory service provide自定义服务
  7. cocos2d-x画线
  8. IBatisNet 升级到 .Net Framework 4.0 时发现 IBatisNet 一小BUG
  9. B/S页面通用数据权限控制[转]
  10. TCP之1460MSS和1448负载