Python 对类好像没有太大的要求啊

2019-04-12 11:10:01 +08:00
 moxiaowei

python 学了好久了,项目也写了好多个,发现 python 不像 java、php 那般对面向对象有严格的要求。写脚本面向过程、写爬虫也只要使用 scrapy 就行,是不是说明 python 面向对象不重要啊!!有没有 python 大牛解答下!

4506 次点击
所在节点    Python
37 条回复
fengjianxinghun
2019-04-12 11:16:25 +08:00
python 是多范式语言
AngryMagikarp
2019-04-12 11:24:15 +08:00
面向对象本来就不应该是语言强制的东西,它是软件管理的工具,不是目的。

重不重要看项目,怎么让项目结构清楚就怎么组织,有些地方你用包(文件)直接当作类用也是可以的。
aijam
2019-04-12 11:27:46 +08:00
感觉又是一个被 Java 荼毒的。
另外,“ php 那般对面向对象有严格的要求”?
xpresslink
2019-04-12 11:42:15 +08:00
Python 里面所有的东西都是对象,你却说没有类?
你不显示定义类所在脚本文件就是类,if __name__ == '__main__': 见过吧,这问题说多了都是泪。
在你没有定义类的时候,还不是解释器默认就把类给你包上了,还不是怕你累。
caoyouming
2019-04-12 12:20:42 +08:00
@aijam php 面向对象还是很有要求的呀,虽然都是源自 java
r0ck3r
2019-04-12 12:55:14 +08:00
静态语言做设计只能用 OO,duck typing 的语言,不限制你必须用对象来实现,怎么方便怎么来
GeruzoniAnsasu
2019-04-12 13:01:59 +08:00
你的感觉是对的

python 的 class 大多数情况下仅仅是个 namespace,想要在 python 里复刻 java 或者 c++的 oo 用法既容易踩坑,又折腾,又没必要

别听 python 信徒说的“ python 里一切东西都是对象”
我就问问 python 里 “ class 的定义是 type 为 class 的 object 而 class 本身是 type 为 type 的 object ” 能不能给我解释清楚这么做除了混淆语义还有啥用
btv2bt
2019-04-12 13:03:09 +08:00
上来就写类的,就烦
vicalloy
2019-04-12 13:16:49 +08:00
并不是强制要用类,但很多时候用类可以让代码结构更清晰。
常用的 Python 库好像没有几个是纯函数的。
https://scrapy.org/ 首页的范例代码也用的是类。
Aumujun
2019-04-12 13:38:01 +08:00
@GeruzoniAnsasu 你在说啥, 可以打标点么
youngce
2019-04-12 13:50:30 +08:00
面向对象编程的思想很重要,面向 class 编程的规定不重要。思想不要被局限
congeec
2019-04-12 14:00:59 +08:00
@GeruzoniAnsasu 这样理解,cpython 源码里 PyObject *无处不在
congeec
2019-04-12 14:05:22 +08:00
我平时主要那类当命名空间用,继承,多态和消息传递用的真不多

python 是门多范式语言,函数式和命令式很多时候够用就好
silkriver
2019-04-12 14:17:18 +08:00
python 里
类就是 class 为 type 的对象
实例就是 class 为其他类的对象
这个没什么不清楚的
metaquant
2019-04-12 14:36:45 +08:00
面向对象编程也不能万能,适合用的时候用,不适合用的就不要用,python 做数据分析、科学计算的时候,函数式编程范式明显更好用
fuxiuyin
2019-04-12 14:50:48 +08:00
@GeruzoniAnsasu 这一点比较好解释的角度是从 CPython 实现的角度,CPython 实现 Python 类型系统,数据和操作分离管理的,操作存在 Class 里面数据存在 Object 里面,每一个 Class 都是 PyTypeObject 这个 C struct 的实例这就是“ class 的定义是 type 为 class 的 object ”,PyTypeObject 当中记录了对 Class 的相关管理操作比如 C 层面的内存分配和释放什么的,Python 当中的<type>是 C 层面上 PyTypeObject 的一个实例 PyType_Type (所以<type>就是一个 Class 因为他是 PyTypeObjet 的实例),里面记录了最通用的 Class 操作方式就是上面说的 C 层面内存分配呀释放呀什么的,新的 Class 一般情况下使用通用的 Class 相关操作就行于是就直接用<type>里面实现,从概念上讲新 Class 就是<type>的子类。如果面向对象用蓝图和产品来类比的话,Python 当中的 PyTypeObject 相当于工厂图纸,<type>相当世界上第一个工厂,用户自定 Class 也是工厂是基于工厂蓝图 PyTypeObject 仿照世界第一个工厂<type>建立的工厂。这么实现显然是方便管理和实现另外就是允许程序在运行过程中动态的建立工厂也就是动态的写 Class,就是程序自己组一个 Class 出来。
BBrother
2019-04-12 14:55:14 +08:00
楼主不用 ORM ?
xpresslink
2019-04-12 16:16:40 +08:00
@GeruzoniAnsasu
关于你的这个问题确实能把人绕晕了。我以前写一篇博客详细说明过。

Python 中所有东西都是对象,比较特殊的是:object 和 type 是 python 中的两个源对象,它们是互相依赖对方来定义,不能分割来说,就如同讨论“先有鸡还是现有蛋”,一样让人蛋疼。

先介绍有两个黑魔法在后面要用到:
obj.__bases__ 指这个对象的父类,就是说从谁继承来的。
obj.__class__ 指这个对象的类型,类的类型是 type

Python 的面向对象系统有两条线索。

1.继承关系也就是父类和子类的关系( the subclass-superclass relationship ),以 object 为起点;

所有对象的父类是 object,因此 object 是没有父类的。
>>> object.__bases__
()

type 也是 object 的子类
>>> issubclass(type, object)
True
>>> type.__bases__
(<class 'object'>,)

2.类型和实例之间的关系( the type-instance relationship ),以 type 为起点。

type 是自身的实例,或说 type (对象 object )的 class (类型 type )是 type
>>> isinstance(type, type)
True

>>> type(type)
<class 'type'>

>>> type.__class__
<class 'type'>

就连 object 都是 type 的实例
>>> isinstance(object, type)
True


最后总结一下:
type 是一个比较特殊的类,这里引出另一概念元类,普通类实例化出来一个对象,但是元类实例化出来的是一个类,
int、float、str、boolean、tuple、dict、set 等内置的数据类型其实也就是内置的类都是 type 实例。

>>> isinstance(int, type)
True

>>> int.__class__
<class 'type'>
>>> 


object 是所有对象(包括类对象)的父类,int、float、str、boolean、tuple、dict、set 内置类都是 object 子类。
>>> int.__bases__
(<class 'object'>,)

>>> issubclass(int, object)
True

---------------------
作者:混沌鳄鱼
来源:CSDN
原文: https://blog.csdn.net/xpresslink/article/details/82494256
版权声明:本文为博主原创文章,转载请附上博文链接!
guyujiezi
2019-04-12 16:20:18 +08:00
@GeruzoniAnsasu 你看看隔壁的 javascript,总比它的原型链继承要清晰明了
wind3110991
2019-04-12 16:38:05 +08:00
面向对象这个事,我觉得就跟不同装修风格的房子一样,看自己怎么样选择才住的舒服了。

Java 和 C++就像是传统的 x 房 x 厅 x 室,方方正正,浴室、厨房、卫生间、卧室等等每一间房间都有相应的功能,开门即用;
python 和 golang 就像是开放式、风格自由的房子:开放式厨房与餐厅,办公桌与卧室连一起,浴室与卫生间等等在一起没有太划分界限;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/554372

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX