python 学了好久了,项目也写了好多个,发现 python 不像 java、php 那般对面向对象有严格的要求。写脚本面向过程、写爬虫也只要使用 scrapy 就行,是不是说明 python 面向对象不重要啊!!有没有 python 大牛解答下!
1
fengjianxinghun 2019-04-12 11:16:25 +08:00
python 是多范式语言
|
2
AngryMagikarp 2019-04-12 11:24:15 +08:00 1
面向对象本来就不应该是语言强制的东西,它是软件管理的工具,不是目的。
重不重要看项目,怎么让项目结构清楚就怎么组织,有些地方你用包(文件)直接当作类用也是可以的。 |
3
aijam 2019-04-12 11:27:46 +08:00
感觉又是一个被 Java 荼毒的。
另外,“ php 那般对面向对象有严格的要求”? |
4
xpresslink 2019-04-12 11:42:15 +08:00 2
Python 里面所有的东西都是对象,你却说没有类?
你不显示定义类所在脚本文件就是类,if __name__ == '__main__': 见过吧,这问题说多了都是泪。 在你没有定义类的时候,还不是解释器默认就把类给你包上了,还不是怕你累。 |
5
caoyouming 2019-04-12 12:20:42 +08:00 via Android
@aijam php 面向对象还是很有要求的呀,虽然都是源自 java
|
6
r0ck3r 2019-04-12 12:55:14 +08:00
静态语言做设计只能用 OO,duck typing 的语言,不限制你必须用对象来实现,怎么方便怎么来
|
7
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 ” 能不能给我解释清楚这么做除了混淆语义还有啥用 |
8
btv2bt 2019-04-12 13:03:09 +08:00 via Android
上来就写类的,就烦
|
9
vicalloy 2019-04-12 13:16:49 +08:00
|
10
Aumujun 2019-04-12 13:38:01 +08:00
@GeruzoniAnsasu 你在说啥, 可以打标点么
|
11
youngce 2019-04-12 13:50:30 +08:00
面向对象编程的思想很重要,面向 class 编程的规定不重要。思想不要被局限
|
12
congeec 2019-04-12 14:00:59 +08:00 via iPhone
@GeruzoniAnsasu 这样理解,cpython 源码里 PyObject *无处不在
|
13
congeec 2019-04-12 14:05:22 +08:00 via iPhone
我平时主要那类当命名空间用,继承,多态和消息传递用的真不多
python 是门多范式语言,函数式和命令式很多时候够用就好 |
14
silkriver 2019-04-12 14:17:18 +08:00 1
python 里
类就是 class 为 type 的对象 实例就是 class 为其他类的对象 这个没什么不清楚的 |
15
metaquant 2019-04-12 14:36:45 +08:00
面向对象编程也不能万能,适合用的时候用,不适合用的就不要用,python 做数据分析、科学计算的时候,函数式编程范式明显更好用
|
16
fuxiuyin 2019-04-12 14:50:48 +08:00 2
@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 出来。
|
17
BBrother 2019-04-12 14:55:14 +08:00
楼主不用 ORM ?
|
18
xpresslink 2019-04-12 16:16:40 +08:00 1
@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 版权声明:本文为博主原创文章,转载请附上博文链接! |
19
guyujiezi 2019-04-12 16:20:18 +08:00
@GeruzoniAnsasu 你看看隔壁的 javascript,总比它的原型链继承要清晰明了
|
20
wind3110991 2019-04-12 16:38:05 +08:00
面向对象这个事,我觉得就跟不同装修风格的房子一样,看自己怎么样选择才住的舒服了。
Java 和 C++就像是传统的 x 房 x 厅 x 室,方方正正,浴室、厨房、卫生间、卧室等等每一间房间都有相应的功能,开门即用; python 和 golang 就像是开放式、风格自由的房子:开放式厨房与餐厅,办公桌与卧室连一起,浴室与卫生间等等在一起没有太划分界限; |
21
secsilm 2019-04-12 16:39:02 +08:00 via Android
函数是一等公民
|
22
PanPancf 2019-04-12 16:55:44 +08:00
@xpresslink Python 这一套类对象的关系跟 Objective-C 差不多
|
23
dioxide 2019-04-12 17:54:08 +08:00
似乎这方面和 js 更像
|
24
Trim21 2019-04-12 18:06:51 +08:00
是没啥要求, 想咋写咋写...
|
25
janxin 2019-04-12 18:30:57 +08:00
php 有严格的要求想了解一下?
|
26
Hopetree 2019-04-12 21:22:28 +08:00
python 里面所有的东西都是对象
|
27
zxcvsh 2019-04-12 23:01:35 +08:00 via iPhone
python 你点源码看不到所以这样说吧...
|
28
hhhsuan 2019-04-12 23:49:17 +08:00
python 比 java 更面向对象
|
29
wwqgtxx 2019-04-12 23:49:21 +08:00
看看这个是不是更有趣了
>>> def aa(): ... pass ... >>> type(aa) <class 'function'> >>> aa <function aa at 0x000001321391C268> >>> aa.__call__ <method-wrapper '__call__' of function object at 0x000001321391C268> |
30
lynskylate 2019-04-12 23:57:59 +08:00 via Android
@GeruzoniAnsasu 你可以看看 js 的 typeof,我到觉得 python 的 type 反而清晰,还可以用 type 进行元编程。反正这些在 c 层面都是一个 PyObject 的对象
|
31
est 2019-04-13 00:00:30 +08:00
发明一个 orm 的轮子,或者想实现一些 chain method 就好玩了。
|
32
tairan2006 2019-04-13 00:07:22 +08:00
面向对象入脑了么,哈哈哈
建议学习 Haskell 洗脑 |
33
Junian 2019-04-13 02:49:30 +08:00 via iPad
主要是为了设计模式
|
34
thautwarm 2019-04-13 09:34:34 +08:00 via Android
@xpresslink 不是类,是模块。你定不定义类都没关系。
|
35
iorilu 2019-04-13 21:59:15 +08:00
|
36
shyrock 2019-04-15 11:25:53 +08:00
@xpresslink #18 赞一个,讲得很清晰
|
37
Marsss 2019-04-16 08:38:09 +08:00 via iPhone
确实没有严格要求,但在供其他脚本调用的时候,用类包装起来会更好。
|