python面向对象有什么用_Python 中的面向对象没有意义
许多人都在抨击面向对象,虽然我不认为他有什么问题,但我觉得至少在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 中的面向对象没有意义相关推荐
- python中matplotlib是什么意思_python中Matplotlib面向对象是什么?
之前讲过Matplotlib以及作图的一些小技巧.那么,小编问大家Matplotlib面向对象是什么?有的人就答不上来了.接下来我们一起探究. Matplotlib中常⽤对象的包含关系为Figure ...
- python购物车结算不了_python中购物车
python的基础语法 python数据类型:(按特征划分) 数字类型: 1.整形:布尔形.长整型L.标准整形 2.非整形:双精度型.复数.decimal(不是内建类型) 序列类型: 1.字符串(st ...
- python迭代是什么意思_python中什么是迭代?
python中什么是闭包? *Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西. 闭包的概念 我们尝试从概念上去理解一下闭包. 在一些语言中, ...
- python里的join方法_python中join()方法介绍
描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str . join ( sequence ) 参数 sequence -- ...
- python常用函数的用法_python中常用函数整理
1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object):""&qu ...
- python怎么用第三方库_python中第三方库的下载方法
1.最常用:在命令行中输入 pip install "库名称" 例如 pip install gensim 查看pip的命令集: pip uninstall "库名& ...
- python新式类c3算法_python中的MRO和C3算法
一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...
- python下载哪一个安装包_python中正确安装对应版本的包
python在写机器学习的代码过程中,需要引入如numpy.matpoltlib.pandas等等等.有时候直接pip install+对应的包名并不能正确安装,或者安装后依旧会出现安装不完全的情况. ...
- python中arange是什么意思_python中arange是什么意义【Python教程】,python,arange
arange函数用于建立等差数组,运用频次异常高,arange异常相似range函数,会python的人一定经经常使用range函数,比如在for循环中,险些都用到了range,下面我们经由过程ran ...
最新文章
- linux进程操作命令,linux常用进程命令
- 漫画设计模式:什么是 “装饰器模式” ?
- php自动停止原因,解析mysql自动停止服务解决办法
- boost::fusion::filter_if用法的测试程序
- python pprint_如何美观地打印 Python 对象?这个标准库可以简单实现
- @async方法不调用了_在Spring中使用Future对象调用Async方法调用
- 时间管理,从洗碗开始
- vue复选框组件自定义对勾_vue2.0中ckeckbox(复选框)的使用心得,及对click事件和change的理解...
- 字符串之String类
- USACO 5.3 Window Area
- 游戏软件的测试方法简述
- MyEclipse安装包
- java中几个常用的开源常用工具类
- 粉笔计算机基础知识,计算机基础知识2-实作.ppt
- java 四分位算法_四分位数怎么算
- 《JavaScript》条件运算符
- Tomcat日志切割工具 logrotate
- System32/SysWow64
- 居家也可以减肥?懒人瘦身也能行-987减肥网
- 加工奶制品的生产计划