python 有class外壳不一定是oop,到底怎么oo?
1、继承 封装 多态是面向对象的三大特点,当年在考c++期末考试时候这三个特点还是作为填空题出现的。
而且老师也反复唠叨继承封装 多态,这三个词语是背得滚瓜烂熟了,但因为不是特别专业的计算机科班,学得不深入,只是能背着三个词语。
2、直到好几年上班后,经过了长时间的面向过程写代码和面向对象写法实践对比才更有体会。
最近 任务很多,对我来说都是新任务,但是都是老任务别人做的我现在接手。
3、因为写那些代码的人很多,所以风格也很多,但基本有一点相同的是都是向过程的风格。也就是代码里面完全看不到class关键字。
也看过有人写class,但让我很吃惊,这个class类写得很极端,这需要我也以此形成总结,引以为戒,激励反思促进。
因为看到的这个是使用了类,是和其他清一色的纯函数编程的代码相比很特殊的,但看了类之后,其实是个100%面向过程的,也就是说只有class关键字外壳,但没有一丝面向对象的思想内涵。
4、怎么判断一个类是不是面向过程的思维呢,抛开继承 封装 多态这么宽泛的概念不说。其实可以判断的方法之一是看类里面的方法,是不是都很频繁的return和传参,是不是很少用到实例属性,是不是有多个方法的参数传参代表的意义是传入的是同一个东西,如果符合这个特点,90%的可能性就是在使用纯面向过程了,这种情况下其实写个类是没什么鸟用的,只是把命名空间下沉了一级,而且由于频繁的return和传参导致代码也很难看懂,这种类加方法和面向过程在模块+函数基本上没什么卵区别。没有继承 没有封装 没有多态还叫什么面向对象,尤其是没有封装没那怎么能叫面向对象?
5、在写面向过程时候,为了尽可能模拟多实例或者增加使用灵活性,思维就会形成多return多传参,少写全局变量。但这种思维深入人心之后,再写oop代码就会完全的转不过弯来。
因为频繁 传参 return的代码,读起来很费劲,传参和return一环套一环的,特别是没有类型注释 意义注释 ,很难读懂,oop能很好解决。
在写oop时候,你一定要多联想全局变量,把那些想当多的一部分在面向过程时候需要return和传参的,思维上把他们想象修改为全局变量,然后在写一个类,把全局变量下沉到实例属性,函数下沉到方法,由于少了很多return和传参,代码就能清晰很多了。
关于怎么写一个oop的类,可以参考我的 三步转oo的文章。如果没有这种意识,就算写了个class外壳也是白塔,因为这么写并没有获得一丝的面向对象带来的优点。
python 有class外壳不一定是oop,到底怎么oo?的更多相关文章
- Python核心编程读笔 12:OOP
第13章 面向对象编程 一.基本概念 1.object类是所有类的基类,如果你的类没有继承任何其他父类,object 将作为默认的父类. 2.python创建实例时无需new: myFirstObje ...
- python, 面向对象编程Object Oriented Programming(OOP)
把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数 ...
- Python 里的「单分派泛函数」到底是什么?
泛型,如果你学过Java ,应该对它不陌生吧.但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛型函数. 在Python中只能实现基于单个(第一个)参数的数据类型来选择具体的实现方式 ...
- 用Python来搞副业?这届大学生到底有多野……
最近,我在知乎上偶然发现一个有意思的问题: 「大学生实习被当作廉价劳动力,你怎么看?」 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...
- Python中文件读写之 w+ 与 r+ 到底有啥区别?
其实r 是只读,只能读不能写,这是很明确的,但是r+是可读写,变成r+后还没太明白到底加了什么,还是照样写不了,有没有这样的体验呢,如下代码,只读时 f = open("test.txt&q ...
- 学习笔记(1):零基础掌握 Python 入门到实战-列表与元祖到底该用哪个?(二)...
立即学习:https://edu.csdn.net/course/play/26676/338778?utm_source=blogtoedu 列表不能通过增加索引增加元素 可以使用list中的app ...
- 博客之旅的开始-----什么是Python ? ? ?
1 .到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 答案下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前 ...
- Boost.Python简介
Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 以下内容搬运自:https://wi ...
- Python2.6-原理之类和oop(下)
来自<python学习手册第四版>第六部分 五.运算符重载(29章) 这部分深入介绍更多的细节并看一些常用的重载方法,虽然不会展示每种可用的运算符重载方法,但是这里给出的代码也足够覆盖py ...
随机推荐
- Java编程的逻辑 (40) - 剖析HashMap
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 25个最常用的iptables策略
1.清空存在的策略当你开始创建新的策略,你可能想清除所有的默认策略,和存在的策略,可以这么做:iptables -F 或者iptables --flush2,设置默认策略默认链策略是ACCEPT,改 ...
- 妙用CTE,一条语句实现sql递归查询,SQLServer 递归
数据库设计中经常碰到父子节点的关系结构,经常需要找到某个节点的根,或者某个节点的所有子节点,一般做法都是在业务层做递归的方式实现,或者数据库存储过程实现.但其实SQLServer提供的CTE可以很好的 ...
- openvpn push "route
①在openvpn的配置文件里增加push "route 192.168.4.0 255.255.255.0",目的是为客户端加一条路由,这样客户端才有可能访问到办公网络中出VPN ...
- iOS 基础入门--Bull' Eye 小游戏
说明 Bull's Eye小游戏是http://www.raywenderlich.com/store/ios-apprentice里非常酷的入门demo 跟着该教程一步步做下来便有了 ...
- 1<<30 hashMap 中使用位移运算的意义
static final int MAXIMUM_CAPACITY = 1 << 30; 计算过程已1<<30为例,首先把1转为二进制数字 0000 0000 0000 000 ...
- (笔记)Linux线程编译undefined reference to 'pthread_create'
在使用线程时,使用gcc或arm-linux-gcc编译时,会出现错误:undefined reference to 'pthread_create' 主要是以下两种原因: 1.#include &l ...
- Maven外部依赖
正如大家所了解的那样,Maven确实使用 Maven 库的概念作依赖管理.但是,如果依赖是在远程存储库和中央存储库不提供那会怎么样? Maven 提供为使用外部依赖的概念,就是应用在这样的场景中的. ...
- Eclipse中创建Maven项目失败
Eclipse中创建Maven项目报错:Unable to create project from archetype org.apache.maven.archetypes:maven-archet ...
- LCL Socket基类
SocketBase类库主要是方便创建Socket客户端和Socket服务端的基础实现. 抽象基类:主要实现创建Socket public abstract class NetworkBase{} 通 ...