python中面向对象的缺点_面向对象中的多态在 Python 中是否没有什么意义?
谢邀!
话说,你为什么说Python中没有数据类型的概念。Python肯定是有数据类型的,在我所见的所有语言中,没有一门编程语言是没有数据类型的。
依据你的问题,我理解或许你的意思是,Python没有类似Java和C++那样的抽象类、接口的概念,而且参数定义与传递时,可以任意改变数据类型。其实,python是有这些的,只是不被推荐。
来说说python中推荐的方式吧。
先举个例子,以知乎官方萌物 "刘看山" 举例。它可以帮助自动邀请别人回答问题。第一次见到时,发现它长这样:
从上面的图中可以知道,刘看山除了能帮助邀请别人答题,还能看书。但是它是啥呢?看着有鼻子有眼,看起来像条狗,那么试着定义如下的类:
class Dog:
def __init__(self, name):
self.name = name
def invite(self):
print("自动邀请牛人帮你答题")
def read_book(self):
print("我要看会儿书")
写完代码之后,不太放心,百度一下。原来并不是狗,而是一种称为北极狐的动物。赶紧修改一下代码吧。
class ArcticFox:
def __init__(self, name):
self.name = name
def invite(self):
print("自动邀请牛人帮你答题")
def read_book(self):
print("我要看会儿书")
接着可以来定义一个函数,我们让刘看山把所有它能干的活都干了。
def liukanshan_dowork(liukanshan):
liukanshan.invite()
liukanshan.read_book()
因为python没有任何类型限制,所以liukanshan函数可以传入任何类型参数进来。
liukanshan = ArcticFox("刘看山")
liukanshan_dowork(liukanshan)
上面的代码中定义变量liukanshan,并赋值为ArticFox类型,接着可以干活了。
假设某天,知乎发现刘看山这只北极银狐每天干这么多活太累了,决定为它找个帮手,和它干同样的活,起名为刘看水,并且不再是北极狐,而是一条狗。
liukanshui = Dog("刘看水")
liukanshan_dowork(liukanshui)
这段代码也是可以执行的。效果是不是和其他语言的多态效果是一样?区别在于没有把 刘看山 和 刘看水 限定为同一类型,而是依据它们的能力决定是否能被同段代码使用。
这就是鸭子模型,此处也可称为 看山 模型(胡扯的,捂脸...)。相对而言,这种编程思维更具灵活性。在鸭子模型中,一个对象是否可用不再由继承特定类或实现特定接口实现,而是由它有的"方法和属性的集合"决定。
鸭子模型的简单灵活,甚至会让我们没有意识到python中有多态。 这是动态语言的优点,但也是动态语言的缺点。优点是,通过这个特性,我们省去了繁杂的继承关系,同时实现很多静态语言无法实现的高级用法,加快了开发的效率。缺点是,过于灵活的语言就必然会增加出错的概率,不便于后期的维护。而且,灵活的语法通常会以降低语言性能为代价。
说到这里,突然想到了最近在学的GO语言,它实现一套类似鸭子模型的基于接口的编程方式,多了动态语言的灵活性,同时也有类型约束,真的是so cool。
python中面向对象的缺点_面向对象中的多态在 Python 中是否没有什么意义?相关推荐
- python完全支持面向对象编程思想_面向对象的编程思想和Python的继承和多态,特殊方法,引用计数...
面向对象的编程思想和Python的类,访问和属性,继承 在上一文中我们了解到了,私有的属性的访问方式:实例名._类名__私有属性名. 一.私有的属性如何对外提供公有的取值和赋值方法呢?提供公有的方法作 ...
- python是一种面向对象的高级语言_为什么入门大数据选择Python而不是Java?
马云说:"未来最大的资源就是数据,不参与大数据十年后一定会后悔."毕竟出自wuli马大大之口,今年二月份我开始了学习大数据的道路,直到现在对大数据的学习脉络和方法也渐渐清晰.今天我 ...
- python三大特征六大原则_面向对象程序设计(Object Oriented Programming)的三大特性,六大原则...
三大特性 封装.继承.多态性 拿简单工厂模式举例: namespace DesignMode_01 { // 计算基类 public class Operation { private double ...
- python 去除panda安装包_沉淀,再出发:python中的pandas包
沉淀,再出发:python中的pandas包 一.前言 python中有很多的包,正是因为这些包工具才使得python能够如此强大,无论是在数据处理还是在web开发,python都发挥着重要的作用,下 ...
- python中如何移动图形工作站_六招教你用Python分分钟构建好玩的深度学习应用
原标题:六招教你用Python分分钟构建好玩的深度学习应用 导读]深度学习是近来数据科学中研究和讨论最多的话题.得益于深度学习的发展,数据科学在近期得到了重大突破,深度学习也因此得到了很多关注.据预测 ...
- python 判断大于等于且小于等于_关于if语句:检查python中值是否大于、小于或等于零的更好方法...
我有一个函数,它检查一个值是否大于.小于或等于零,并根据结果返回三种颜色中的一种.另外,如果某个属性存在,它不会返回三种颜色中的一种,而是返回单独的第四种颜色.我是这样解决的: def set_col ...
- python服务发现与注册_(转)微服务架构中服务注册与发现
https://blog.csdn.net/u011537073/article/details/69663858 想象一下,如果你在写代码调用一个有REST API或Thrift API的服务,你的 ...
- python删除链表中重复的节点_剑指offer:删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- java面向对象模拟电梯_面向对象的程序设计-电梯调度系统的设计、优化与测试...
面向对象的程序设计(2019)第二单元总结 I 对问题的初体验 在开始OO之旅前,对OO电梯早有耳闻.这一次终于轮到我自己实现OO电梯了.首先从顶层需求出发对电梯系统进行分析,对象包括电梯.任务和乘 ...
最新文章
- 深度学习(5)感知机(神经元)与神经网络
- 【神经网络】(7) 迁移学习(CNN-MobileNetV2),案例:乳腺癌二分类
- 论文不公开代码,应该被直接拒稿?
- perl 中单引号双引号的区别-----perl学习笔记
- 详解何恺明团队4篇大作 !(附代码)| 从特征金字塔网络、Mask R-CNN到学习分割一切
- SQL Server 数据库连接字符串的声明
- drupal与html转换,老葛 怎么改变drupal form 生成的html啊 ? | Think in Drupal
- java 实例变量初始化_java学习之实例变量初始化
- Go语言(Golang)约瑟夫游戏(Joseph)
- 基于持久化的wordcount程序 foreachRDD
- vlookup match_INDEX-MATCH — VLOOKUP功能的升级
- 如何用python做一个会聊天的女朋友_520来啦~教你用Python给自己造了一个女朋友!...
- 《Pytorch - 逻辑回归模型》
- Ubuntu下配置使用maven
- 三星手机微信聊天记录删除了怎么恢复
- 人工智能--符号计算--笔记
- 20155313 杨瀚 《网络对抗技术》实验四 恶意代码分析
- python 一维数据和二维数据的存储,表达和处理
- echarts瀑布图_一种基于阶梯瀑布图的数据计算方法与流程
- Java极光短信发送
热门文章
- C语言内存对齐详解(1)
- iphone NSTimer
- 网络***检查分析---破解安全隐患问题回答
- 华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
- 如何将c语言编译器设置为初始状态,C语言编译器设与实现毕业论文设计.doc
- 敏捷开发与测试(面试话题之一)
- sqlite3 可视化工具 linux,【SQLite3下载】SQLite3可视化工具 v3 3.27.2 官方版-开心电玩...
- sql注入python_Python--sql注入
- Mac安装Redis
- php 替换所有中文为空,php 匹配替换中文