【问题标题】:Has Python changed to more object oriented?Python 是否变得更加面向对象?
【发布时间】:2010-10-28 00:39:28
【问题描述】:

我记得有一次,it was said that Python is less object oriented than Ruby,因为在 Ruby 中,一切都是对象。这对于 Python 也有变化吗?最新的 Python 是否比以前的版本更面向对象?

【问题讨论】:

  • 在 Python 中,一切都是对象。你读了什么资料?能否提供网址或报价?
  • @S.Lott — 他是对的;事实上,Ruby 的“关于”页面仍然将其描述为 Ruby 的起源。引用 Matz 的话说:“我想要一种比 Perl 更强大、比 Python 更面向对象的脚本语言。” ruby-lang.org/en/about
  • 我也有同样的看法。 Python 从一开始就更加“结构化”,而 Ruby 天生就是纯 OO。但我不知道为什么..
  • 在 Ruby 中有些东西不是对象。它们伪装成对象,并且(大部分)充当对象,但事实并非如此。不相信我?尝试为数字 3 (a = 3; def a.foo ; end) 定义一个单例方法,然后将显示非对象的锐边。
  • @banister,您的看法与我之前考虑的不同,不一定是错的。从 Ruby 源代码中,我们知道大多数变量都是作为引用保存的,它们本质上指向包含对象的内存,但是对于某些类型,例如 Fixnum,对象的值在引用本身中。这就是为什么你不能在 4 上定义单例:没有可以附加单例的普通实例。与其将“4”视为具有特殊限制的对象,在我看来,它似乎是一个“非对象”,看起来大部分像一个对象。

标签: python ruby oop


【解决方案1】:

我不确定我是否认同 Ruby 比 Python 更面向对象的说法。面向对象不仅仅是使用对象和点语法。我看到的一个常见论点是,在 Python 中要获取列表的长度,您可以执行以下操作:

len(some_list)

我认为这是bikeshed argument。这实际上(几乎直接)转化为:

some_list.__len__()

这是完全面向对象的。我认为 Rubyists 可能会有些困惑,因为通常面向对象涉及使用点语法(例如 object.method())。但是,如果我误解了 Rubyists 的论点,请随时告诉我。

不管它是面向对象的,以这种方式使用 len 有一个优点。一些语言总是让我恼火的一件事是必须记住是否对特定对象使用some_list.size()some_list.length()some_list.len。 Python 的方式意味着只需要记住一个函数

【讨论】:

  • 为什么不直接将 .len() 从列表中暴露出来呢?我认为您不能将 OO 设计与语法完全分开,因为语法在很大程度上定义了您的代码范例。 some_list.len() 是面向对象的,因为您将列表视为一个能够告诉您其长度的对象。 len(some_list) 不是面向对象的,无论它在幕后翻译成什么。
  • 对不起。语法和 OO 彼此无关。 Python 对象可以有非对象语法。它们仍然是对象。
  • 面向对象包括语法和数据模型,但基于对象包括数据模型和可能的语法糖。
  • 请原谅,我不是 python 专家,但我没有看到太多关于真正的“面向对象”的讨论。 len(some_list) 在 python 中是多态的吗?我可以从该列表中继承并覆盖 len 方法吗?只是好奇。
  • @Ogre Psalm33 - 是的。如果覆盖对象的 len 方法,它将控制 len 函数获取的内容。
【解决方案2】:

等等,Ruby 和 Python 都是面向对象的。对象就是对象。没有更多的面向对象的“比较功能”可以引导您获得更好的功能。 语法不仅是使某些语言看起来像面向对象的语言,而且是数据模型

对象是 Python 对数据的抽象。 Python 程序中的所有数据都由对象或对象之间的关系表示。 (在某种意义上,按照冯诺依曼的“存储程序计算机”模型,代码也由对象表示。)http://docs.python.org/reference/datamodel.html

【讨论】:

    【解决方案3】:

    Jian Lin — 答案是“是”,与 Matz 决定创建 Ruby 时相比,Python 更加面向对象,并且两种语言现在都具有“一切都是对象”的特点。在 Python 还年轻的时候,像字符串和数字这样的“类型”缺乏方法,而“对象”是用“类”语句构建的(或者通过故意在 C 扩展模块中构建一个类),效率稍低但确实支持方法和继承。在 1990 年代初期,当一台快速的 386 是一台相当不错的机器时,这种妥协是有道理的。但是类型和类在 Python 2.2(2001 年发布)中是统一的,字符串有方法,在最近的 Python 版本中,用户甚至可以从它们中继承。

    所以:Python 曾经肯定不是面向对象的。但是,据我所知,这些旧障碍现在都已消失。

    这是发生统一的指南:

    http://www.python.org/download/releases/2.2/descrintro/

    澄清:也许我可以更简单地说:在 Python 中,一切一直都是对象;但是一些基本类型的对象(整数、字符串)曾经由“不同的规则”播放,这些规则阻止了 OO 编程方法(如继承)与它们一起使用。现在已经解决了。 len() 方法,在此处的另一个响应中描述,可能是我希望 Guido 在升级到 Python 3.0 时唯一剩下的东西。但至少他给了我字典理解,所以我不会大声抱怨。 :-)

    【讨论】:

    【解决方案4】:

    这是一个错误的信念。

    在这里查看我之前的回答以获得更深入的解释:

    Is everything an object in python like ruby?

    那为什么不直接将 .len() 从列表中暴露出来呢?我认为您不能将 OO 设计与语法完全分开,因为语法在很大程度上定义了您的代码范例。 some_list.len() 是面向对象的,因为您将列表视为一个能够告诉您其长度的对象。 len(some_list)

    .len() 可以直接从列表中删除。它以 __len__() 的形式提供。 len() 是一个函数对象。您可以使用 dir(len) 查看它的所有方法。虽然我不知道 Guido 为何决定延长 __len__() 方法,但这并没有改变所有这些仍然是对象的事实。

    【讨论】:

    • 感谢您的直接回复。我虽然在 Python 中不鼓励直接调用 method,因为 __ 是 private 的简写。我想我只是将 __ 与其他东西混淆了。
    • 方法不同于__method,前者是私有的(非强制的),后者是“具有预定义行为的特殊系统函数”。
    【解决方案5】:

    虽然这不是一个正确的答案......你为什么关心 Python 或多或少是面向对象的? Python 最酷的地方在于它是pythonic,而不是面向对象的、函数式的或任何当下流行的范式! :-)

    我学会了使用 Java 和面向对象进行编程,但现在我对此不屑一顾,因为我知道 OOP 并不是所有问题的解决方案(事实上,没有一个范式可以)。

    见:

    【讨论】:

    • OOP 的风潮永远不会持续。三年过去了?
    【解决方案6】:

    我也有同样的“感知”,或许源于此:

    Why was python created in the first place:

    我突然想到,具有 ABC [...] 之类语法的脚本语言可以满足需求

    An Interview with the Creator of Ruby:

    “我想要一种比 Perl 更强大、比 Python 更面向对象的脚本语言

    我知道感知与现实不同。 Python 和 Ruby 都是很棒的编程语言,而且都非常面向对象。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 2011-04-09
      • 2018-06-12
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多