python 多态app_多态简介 | Python从入门到精通:高阶篇之三十三-阿里云开发者社区...
多态
多态是面向对象的三大特征之一。
多态从字面上理解是多种形态。例如:狗有多个种类(狼狗、藏獒、哈士奇、古代牧羊犬...)。
一个对象可以以不同的形态去呈现。
我们先来定义两个类:
class A:
def __init__(self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
class B:
def __init__(self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
a = A('孙悟空')
b = B('猪八戒')
定义一个函数:
def say_hello(obj):
print('你好 %s'%obj.name)
# say_hello(a)
say_hello(b)
执行结果:
我们来再定义一个C类,c是否可以作为参数传入say_hello:
class C:
pass
c = C()
say_hello(c)
执行结果:
对于say_hello()这个函数来说,只要对象中含有name属性,它就可以作为参数传递,这个函数并不会考虑对象的类型,只要有name属性即可。
我们再来定义一个没有多态属性的函数:
def say_hello_2(obj):
# 做类型检查
if isinstance(obj , A):
print('你好 %s'%obj.name)
# say_hello_2(a)
say_hello_2(b)
执行结果:
在say_hello_2中我们做了一个类型检查,也就是只有obj是A类型的对象时,才可以正常使用,其他类型的对象都无法使用该函数,这个函数就违反了多态。违反了多态的函数,只适用于一种类型的对象,无法处理其他类型对象,这样导致函数的适应性非常的差。
多态的描述:
鸭子类型
如果一个东西,走路像鸭子,叫声像鸭子,那么它就是鸭子。
我们通过一个例子来说明
len()
l = [1,2,3]
s = 'hello'
print(len(l))
print(len(s))
执行结果:
之所以一个对象能通过len()来获取长度,是因为对象中具有一个特殊方法__len__。
换句话说,只要对象中具有__len__特殊方法,就可以通过len()来获取它的长度。
我们在B中定义一个len()
def __len__(self):
return 10
print(len(b))
print(len(c))
执行结果:
B中有len()方法,所以有返回值,但是C中没有,所以程序出错。
注意,像isinstance()这种函数,在开发中一般是不会使用的!可能违反多态。
我们总结一下面向对象的三大特征:
封装
确保对象中的数据安全
继承
保证了对象的可扩展性
多态
保证了程序的灵活性
获取更多资源请订阅Python学习站
python 多态app_多态简介 | Python从入门到精通:高阶篇之三十三-阿里云开发者社区...相关推荐
- python高手之路第三版_《Python高手之路(第3版)》——1.3 版本编号-阿里云开发者社区...
本节书摘来自异步社区<Python高手之路(第3版)>一书中的第1章,第1.3节,作者[法]Julien Danjou,王飞龙 译,更多章节内容可以访问云栖社区"异步社区&quo ...
- python中shutil模块_python文件、文件夹、压缩包处理模块-shutil模块-阿里云开发者社区...
shutil模块 高级的文件.文件夹.压缩包 处理模块 本节内容基本在linux下python交互环境实现 复制移动文件.文件夹 将文件内容拷贝到另一个文件中,可以部分内容 格式如下: ``` shu ...
- python标准库有pickle_Python标准库05 存储对象 (pickle包,cPickle包)-阿里云开发者社区...
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步拓展),我 ...
- python中执行shell命令_python中执行shell命令的几个方法小结-阿里云开发者社区
Python 执行 shell 命令 最近有个需求就是页面上执行shell命令,第一想到的就是os.system os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令 ...
- python合法标识符 40xl_Python基础测验(答案篇)-问答-阿里云开发者社区-阿里云
一.填空题 Python使用符号 # 标示单行注释:以 缩进对齐 划分语句块. Python序列类型包括 字符串 . 列表 . 元组 三种: _字典_是Python中唯一的映射类型. Python序列 ...
- boost库 python_Boost.Python简介-阿里云开发者社区
Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 简介 BoostPython库让C+ ...
- python树莓派编程 沃尔弗拉姆_《 Python树莓派编程》——3.3 Python入门-阿里云开发者社区...
本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfram Donat)著韩德强 等译,更多章节内容可以访问云栖社区&quo ...
- python编写程序 计算1_《Python程序设计》——第1章 计算与问题求解简介 1.1 计算与Python简介-阿里云开发者社区...
本节书摘来自华章计算机<Python程序设计>一书中的第1章,第1.1节,作者:[美]戴维 I.施奈德(David I. Schneider)著,更多章节内容可以访问云栖社区"华 ...
- python es 数据库 复合查询bool_es 入门-阿里云开发者社区
**注意事项-------使用ealsticsearch要配置java的开发环境JDK(1.8以上) ealsticsearch: 索引(Index) 类型(type ...
最新文章
- 把项目发到github
- Mac用Java写出hello,mac中c#的helloworld
- Google 是如何定制 Material 主题的?
- Linux oracle数据库自动备份自动压缩脚本代码
- wxWidgets:wxRichTextCtrl类用法
- 你必须足够强大,这个世界才会更加公平
- node 版本升级_Node-RED: 自动化事件触发工具的安装与介绍
- javascript实例自学手册光盘源码_零基础,自学编程,如何选择语言?
- sql示例_SQL Server Lead功能概述和示例
- RabbitMQ heartbeat原理
- 恶意软件\垃圾流氓通用反删除批处理文件
- 免费升级win10系统方法
- Java毕设项目超市进销存管理系统计算机(附源码+系统+数据库+LW)
- kubernetes入门之Downward API
- Unity功能点---模拟枪械射击时的后坐力
- 基于FPGA低频方波测量-频率与占空比
- 列举网络爬虫所用到的网络数据包,解析包?
- 第二届电气、机械与计算机工程国际学术会议(ICEMCE2018)简单记录
- Win10 home vs pro vs enterprise vs enterprise LTSC
- Atom编辑器:基本使用