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 ...
随机推荐
- Hibernate 查询说明
1.Criteria setFetchSize实际上与分页操作并没有关系,它的作用是在查询中进行分批数据返回,其中的值就是每次分批查询的记录数,主要是为了提高查询性能的. 举个例子来说:如果你这次查询 ...
- WinDbg F9时“code not found breakpoint not set”
当使用Windbg 6.2.9200.16384 进行源码调试时,无法在代码文件中F9设置断点,会出现“code not found breakpoint not set”,我们只有启动下我们自己的驱 ...
- freemarker自己定义标签报错(二)
freemarker自己定义标签 1.错误描写叙述 freemarker.core.ParseException: Unexpected end of file reached. at freemar ...
- java File linux windows 下 绝对路径 相对路径问题
前言 当前项目目录 windows 为 E:\project\testpro\ linux 为 /project/testpro/ Windows环境下获取绝对路径情况 使用 a/b/c 为路径, ...
- Eureka 高可用
spring: profiles: eureka1 server: port: 8001 eureka: instance: hostname: eureka1 client: serviceUrl: ...
- TopComponent设置某个控件焦点
仅仅在 @Override public void componentOpened() { syncBtn.requestFocus(); } 中指定还不够,还需要重载 @Override publi ...
- java 正则表达式 验证字符串 只包含汉字英文数字
String content = “testContent”; String regex="^[a-zA-Z0-9\u4E00-\u9FA5]+$"; Pattern patter ...
- 【5】JVM-垃圾收集器
通过学习了解到现在商用的JVM中的垃圾收集采用的是分代收集算法,即针对不同年代采用不同的收集算法.在JVM中,GC主要作用于堆内存中,堆内存又被划分为新生代和老年代,由于新生代对象绝大多数是朝生夕死, ...
- (笔记)Linux下C语言实现静态IP地址,掩码,网关的设置
#include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #include < ...
- Unity Package Manager Error的解决方案
问题来源 启动Unity时显示 fail to start Unity Package Manager,软件环境为 Unity 2017.3.0f3. 解决方案 根据网上所给的方案,我选择添加环境变量 ...