V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
moxiaowei
V2EX  ›  Python

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

  •  
  •   moxiaowei · 2019-04-12 11:10:01 +08:00 · 4695 次点击
    这是一个创建于 2058 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    37 条回复    2019-04-16 08:38:09 +08:00
    fengjianxinghun
        1
    fengjianxinghun  
       2019-04-12 11:16:25 +08:00
    python 是多范式语言
    AngryMagikarp
        2
    AngryMagikarp  
       2019-04-12 11:24:15 +08:00   ❤️ 1
    面向对象本来就不应该是语言强制的东西,它是软件管理的工具,不是目的。

    重不重要看项目,怎么让项目结构清楚就怎么组织,有些地方你用包(文件)直接当作类用也是可以的。
    aijam
        3
    aijam  
       2019-04-12 11:27:46 +08:00
    感觉又是一个被 Java 荼毒的。
    另外,“ php 那般对面向对象有严格的要求”?
    xpresslink
        4
    xpresslink  
       2019-04-12 11:42:15 +08:00   ❤️ 2
    Python 里面所有的东西都是对象,你却说没有类?
    你不显示定义类所在脚本文件就是类,if __name__ == '__main__': 见过吧,这问题说多了都是泪。
    在你没有定义类的时候,还不是解释器默认就把类给你包上了,还不是怕你累。
    caoyouming
        5
    caoyouming  
       2019-04-12 12:20:42 +08:00 via Android
    @aijam php 面向对象还是很有要求的呀,虽然都是源自 java
    r0ck3r
        6
    r0ck3r  
       2019-04-12 12:55:14 +08:00
    静态语言做设计只能用 OO,duck typing 的语言,不限制你必须用对象来实现,怎么方便怎么来
    GeruzoniAnsasu
        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 ” 能不能给我解释清楚这么做除了混淆语义还有啥用
    btv2bt
        8
    btv2bt  
       2019-04-12 13:03:09 +08:00 via Android
    上来就写类的,就烦
    vicalloy
        9
    vicalloy  
       2019-04-12 13:16:49 +08:00
    并不是强制要用类,但很多时候用类可以让代码结构更清晰。
    常用的 Python 库好像没有几个是纯函数的。
    https://scrapy.org/ 首页的范例代码也用的是类。
    Aumujun
        10
    Aumujun  
       2019-04-12 13:38:01 +08:00
    @GeruzoniAnsasu 你在说啥, 可以打标点么
    youngce
        11
    youngce  
       2019-04-12 13:50:30 +08:00
    面向对象编程的思想很重要,面向 class 编程的规定不重要。思想不要被局限
    congeec
        12
    congeec  
       2019-04-12 14:00:59 +08:00 via iPhone
    @GeruzoniAnsasu 这样理解,cpython 源码里 PyObject *无处不在
    congeec
        13
    congeec  
       2019-04-12 14:05:22 +08:00 via iPhone
    我平时主要那类当命名空间用,继承,多态和消息传递用的真不多

    python 是门多范式语言,函数式和命令式很多时候够用就好
    silkriver
        14
    silkriver  
       2019-04-12 14:17:18 +08:00   ❤️ 1
    python 里
    类就是 class 为 type 的对象
    实例就是 class 为其他类的对象
    这个没什么不清楚的
    metaquant
        15
    metaquant  
       2019-04-12 14:36:45 +08:00
    面向对象编程也不能万能,适合用的时候用,不适合用的就不要用,python 做数据分析、科学计算的时候,函数式编程范式明显更好用
    fuxiuyin
        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 出来。
    BBrother
        17
    BBrother  
       2019-04-12 14:55:14 +08:00
    楼主不用 ORM ?
    xpresslink
        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
    版权声明:本文为博主原创文章,转载请附上博文链接!
    guyujiezi
        19
    guyujiezi  
       2019-04-12 16:20:18 +08:00
    @GeruzoniAnsasu 你看看隔壁的 javascript,总比它的原型链继承要清晰明了
    wind3110991
        20
    wind3110991  
       2019-04-12 16:38:05 +08:00
    面向对象这个事,我觉得就跟不同装修风格的房子一样,看自己怎么样选择才住的舒服了。

    Java 和 C++就像是传统的 x 房 x 厅 x 室,方方正正,浴室、厨房、卫生间、卧室等等每一间房间都有相应的功能,开门即用;
    python 和 golang 就像是开放式、风格自由的房子:开放式厨房与餐厅,办公桌与卧室连一起,浴室与卫生间等等在一起没有太划分界限;
    secsilm
        21
    secsilm  
       2019-04-12 16:39:02 +08:00 via Android
    函数是一等公民
    PanPancf
        22
    PanPancf  
       2019-04-12 16:55:44 +08:00
    @xpresslink Python 这一套类对象的关系跟 Objective-C 差不多
    dioxide
        23
    dioxide  
       2019-04-12 17:54:08 +08:00
    似乎这方面和 js 更像
    Trim21
        24
    Trim21  
       2019-04-12 18:06:51 +08:00
    是没啥要求, 想咋写咋写...
    janxin
        25
    janxin  
       2019-04-12 18:30:57 +08:00
    php 有严格的要求想了解一下?
    Hopetree
        26
    Hopetree  
       2019-04-12 21:22:28 +08:00
    python 里面所有的东西都是对象
    zxcvsh
        27
    zxcvsh  
       2019-04-12 23:01:35 +08:00 via iPhone
    python 你点源码看不到所以这样说吧...
    hhhsuan
        28
    hhhsuan  
       2019-04-12 23:49:17 +08:00
    python 比 java 更面向对象
    wwqgtxx
        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>
    lynskylate
        30
    lynskylate  
       2019-04-12 23:57:59 +08:00 via Android
    @GeruzoniAnsasu 你可以看看 js 的 typeof,我到觉得 python 的 type 反而清晰,还可以用 type 进行元编程。反正这些在 c 层面都是一个 PyObject 的对象
    est
        31
    est  
       2019-04-13 00:00:30 +08:00
    发明一个 orm 的轮子,或者想实现一些 chain method 就好玩了。
    tairan2006
        32
    tairan2006  
       2019-04-13 00:07:22 +08:00
    面向对象入脑了么,哈哈哈

    建议学习 Haskell 洗脑
    Junian
        33
    Junian  
       2019-04-13 02:49:30 +08:00 via iPad
    主要是为了设计模式
    thautwarm
        34
    thautwarm  
       2019-04-13 09:34:34 +08:00 via Android
    @xpresslink 不是类,是模块。你定不定义类都没关系。
    iorilu
        35
    iorilu  
       2019-04-13 21:59:15 +08:00
    @xpresslink 这个说的挺好的

    关键就是两个函数
    issubclass
    isinstance

    碰到疑问, 脑子想下这两个函数会返回什么就清楚一点了
    shyrock
        36
    shyrock  
       2019-04-15 11:25:53 +08:00
    @xpresslink #18 赞一个,讲得很清晰
    Marsss
        37
    Marsss  
       2019-04-16 08:38:09 +08:00 via iPhone
    确实没有严格要求,但在供其他脚本调用的时候,用类包装起来会更好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3061 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:06 · PVG 19:06 · LAX 03:06 · JFK 06:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.