许多人都在抨击面向对象,虽然我不认为他有什么问题,但我觉得至少在Python 中没必要。

近来,许多人都在抨击面向对象,虽然我不认为面向对象本身有什么问题,但我觉得至少在 Python 中没这个必要。

1、没有必要使用面向对象

举个例子,比如下面的代码完全没有必要使用面向对象。

这里使用了面向对象,因为我们想把 root_url 绑定到某个对象上,而且不想每次都传递 sessionmaker。我们还想使用继承,在调用的中途访问一个方法。但如果只通过数据传递和函数能实现吗?

我们必须随时传递 Client 和 session_cls。但有什么关系呢?代码量甚至还少了 10%。这样编写的代码很容易理解,而且不需要使用面向对象。有人管这种写法叫做“函数袋”。就是说,整个代码都由有类型的数据和一大堆模块作用域的函数组成。那么全局变量怎么处理?你可以参考这篇文章(https://leontrolski.github.io/sane-config.html),在整个应用程序的生命周期内重用 config 或 db 的 session,接口、抽象类怎么办?实际上你不需要它们,直接写代码就行了。平心而论,Python 有了类型标注之后,函数袋风格才开始发挥真正的魅力。不纯粹的函数怎么办?如果你想采用纯粹的函数式编程,你可能想编写纯粹的类,然后使用不纯粹的“适配器”实例来做一些处理:getting-the-current-datetime/API-calls/talking-to-the-db/other-impure-stuff。这个想法很不错。实际上你可以直接使用 freezegun、responses 等方法来避免大量麻烦。

2、例外

但也有一些例外的情况:你可能注意到,重构的代码中加入了@dataclass,它们只是记录类型。Python 5 可以直接支持这些,不需要使用“常规”类。

使用 Exception 的子类是没问题的。使用 try: ... except SomeClass: ...,基本上会形成一种层级,不过没关系,只要不要搞得过于复杂。

Enum,与上面一样,它们非常适合 Python。

在极罕见的情况下(至少在应用程序的开发中很少遇到),你可能会想出一种非常好用的类型然后到处使用,就像pandas.DataFrame/sqlalchemy.Session 一样。但是一般情况下,不要自欺欺人,不要骗自己说我们正在构建了不起的应用程序。谦虚使人进步。

3、面向对象的弊端

虽然在本文开头,我说过我不认为面向对象本身有什么问题,但实际上我还是觉得面向对象不仅没有帮助性,而且还常常混淆问题,鼓励一些不良做法:面向对象鼓励你修改数据。函数袋非常反对修改参数。不相信的话,你可以试试看,但可千万别生气。

面向对象只是返回的全局变量。你无法在函数之间共享数据,self 会强迫你使用更小的状态空间编写方便测试的函数。

混合数据和函数会加剧序列化的难度,而在当今 REST API 流行的情况下,序列化非常有用。

面向对象带来了疯狂的继承体系,关于这个话题的讨论到处都是。

最重要的是,面向对象没有任何附加价值,它只会导致你无法专心解决问题,并加剧浏览与理解代码的难度。

python面向对象有什么用_Python 中的面向对象没有意义相关推荐

  1. python中matplotlib是什么意思_python中Matplotlib面向对象是什么?

    之前讲过Matplotlib以及作图的一些小技巧.那么,小编问大家Matplotlib面向对象是什么?有的人就答不上来了.接下来我们一起探究. Matplotlib中常⽤对象的包含关系为Figure ...

  2. python购物车结算不了_python中购物车

    python的基础语法 python数据类型:(按特征划分) 数字类型: 1.整形:布尔形.长整型L.标准整形 2.非整形:双精度型.复数.decimal(不是内建类型) 序列类型: 1.字符串(st ...

  3. python迭代是什么意思_python中什么是迭代?

    python中什么是闭包? *Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中, ...

  4. python里的join方法_python中join()方法介绍

    描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str . join ( sequence ) 参数 sequence -- ...

  5. python常用函数的用法_python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object):""&qu ...

  6. python怎么用第三方库_python中第三方库的下载方法

    1.最常用:在命令行中输入  pip install "库名称"  例如 pip install gensim 查看pip的命令集: pip uninstall "库名& ...

  7. python新式类c3算法_python中的MRO和C3算法

    一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...

  8. python下载哪一个安装包_python中正确安装对应版本的包

    python在写机器学习的代码过程中,需要引入如numpy.matpoltlib.pandas等等等.有时候直接pip install+对应的包名并不能正确安装,或者安装后依旧会出现安装不完全的情况. ...

  9. python中arange是什么意思_python中arange是什么意义【Python教程】,python,arange

    arange函数用于建立等差数组,运用频次异常高,arange异常相似range函数,会python的人一定经经常使用range函数,比如在for循环中,险些都用到了range,下面我们经由过程ran ...

最新文章

  1. linux进程操作命令,linux常用进程命令
  2. 漫画设计模式:什么是 “装饰器模式” ?
  3. php自动停止原因,解析mysql自动停止服务解决办法
  4. boost::fusion::filter_if用法的测试程序
  5. python pprint_如何美观地打印 Python 对象?这个标准库可以简单实现
  6. @async方法不调用了_在Spring中使用Future对象调用Async方法调用
  7. 时间管理,从洗碗开始
  8. vue复选框组件自定义对勾_vue2.0中ckeckbox(复选框)的使用心得,及对click事件和change的理解...
  9. 字符串之String类
  10. USACO 5.3 Window Area
  11. 游戏软件的测试方法简述
  12. MyEclipse安装包
  13. java中几个常用的开源常用工具类
  14. 粉笔计算机基础知识,计算机基础知识2-实作.ppt
  15. java 四分位算法_四分位数怎么算
  16. 《JavaScript》条件运算符
  17. Tomcat日志切割工具 logrotate
  18. System32/SysWow64
  19. 居家也可以减肥?懒人瘦身也能行-987减肥网
  20. 加工奶制品的生产计划

热门文章

  1. 封装之--通过类中公有方法访问私有成员变量
  2. py文件转exe时包含paramiko模块出错解决方法
  3. 消失的字符串——c语言函数中的数据存储方式以及字符串实现
  4. 采购订单接收备注为必输项
  5. Shell中的特殊字符
  6. Android AlertDialog学习
  7. mpeg2,mpeg4,h264编码标准的异同
  8. 无人驾驶汽车之争本田为何未战先败
  9. 【深度学习】mask_rcnn训练自己的数据集以及模型使用(实践结合GitHub项目)
  10. opencv的pnp()算法接口是相对于3D点,输出的是相机与3D点之间的R和T