【问题标题】:Why is Python not fully object-oriented? [closed]为什么 Python 不完全面向对象? [关闭]
【发布时间】:2010-07-24 13:47:24
【问题描述】:

我想知道为什么 Python 不是完全面向对象的。例如,它不支持私有、公共、受保护的访问级别修饰符。

这样做的优点和缺点是什么?通过这些表述,Python 适用于哪些应用程序(桌面、科学、Web 或其他)?

【问题讨论】:

  • Python 适用于几乎所有不依赖于硬数字运算的东西,但即便如此,您也可以用 C 编写这些部分。封装在动态类型语言中并不是那么有用。它只帮助编译器,即使在 Java 中,您也可以(有时需要)通过反射来规避它。恕我直言,封装并没有增加任何安全性,它只是让您感觉有更多的安全性。
  • @extraneon:不,只是为了知道。 @Wetzel:我同意你的观点“封装在动态类型语言中没那么有用”。
  • Python 是“完全面向对象的”。 “面向对象”是一个创造的术语,而不是由某种语言(例如 Java)定义的。这是一个计算机理论。 Python 只是以不同的方式做这件事,但有充分的理由。诸如将属性设为私有的能力等“特性”与语言的实用性无关,而与使用该语言时对良好实践的微妙执行有关。
  • @orokusaki 我知道已经 5 年了,但是......“使属性私有化的能力”是计算机理论所说的封装,并且是 OO 的三大支柱之一。现在:Python 没有“private”仍然是真的吗,或者这已经改变了吗?
  • @ТаняТ。很抱歉不得不通知你,你的教授可能让你失望了。请查看en.wikipedia.org/wiki/… 并注意关键词“两个相关但不同的点之一”,就在最接近该页面顶部的两个项目符号之前。

标签: python oop


【解决方案1】:

Python 不支持强封装,这只是与术语“面向对象”相关的众多特性之一。

答案就是哲学。 Guido 不喜欢隐藏东西,Python 社区中的许多人都同意他的观点。

【讨论】:

  • +1,正确答案。虽然我想说:Python 不强制(信息隐藏/封装)。 obj._field 是“私有的”,因为惯用的 python 代码不会访问它,除非必要(dir() 函数、反射、序列化,不得不绕过无法更改的遗留代码的限制)。并且 Python 比 e.g. 更 OO。 Java 或 C++ 或 C#,因为没有原语。
  • @delnan:你是对的; Python 不强制隐藏/封装。它也不像 C 那样支持隐藏/封装。事实上,在没有反射的情况下,C 比 Python 更好地支持隐藏! :-)
  • 仅供参考:C# 的原语实际上是从 System.ValueType 派生的,而 System.ValueType 是从 System.Object 派生的。事实上,C# 是我所知道的唯一真正的 OO 语言,因为一切都是对象。
  • @Motig Ruby 也是真正的 OO。
  • Python 教程说,“Python 中没有任何东西可以强制执行数据隐藏——这一切都基于约定
【解决方案2】:

Guido 曾经说过“我们在这里都是同意的成年人”。这是很久以前的较长解释:http://mail.python.org/pipermail/tutor/2003-October/025932.html

有一个协议,下划线表示私有元素,您不应该使用它们。除非你知道自己在做什么并且你真的很想这样做。

该链接还提到了在 Perl 的情况下的另一种方式:

"一个 Perl 模块会更喜欢你 呆在客厅外面
因为你没有被邀请,不是 因为它有霰弹枪。”

【讨论】:

  • 喜欢这些名言。我相信拥有私有实例变量不仅仅是为了防止程序员进入你的客厅。在许多常见情况下(尤其是在 setter 方法中),无论出于何种原因,您都希望您的对象在对象内部存储某些数据之前对其进行更改或格式化。在这种情况下,您不能指望其他程序员知道应该如何存储或访问该变量。所有这些逻辑都可以封装在 getter 和 setter 方法中。让 ivars 暴露是混乱/令人困惑/误导的。这几乎是我保护隐私的唯一论据。
【解决方案3】:

如果一种语言没有原始数据类型,则称其为完全面向目标的语言。我们需要构造的每种数据类型。

【讨论】:

    【解决方案4】:

    我认为 Python 被设计为混合体。您可以编写面向对象或函数式的样式。

    面向对象的特点是抽象、封装、继承和多态。 Python 中缺少哪些?

    面向对象是一个连续统一体。我们可以说,Smalltalk 是最纯粹的,其他所有在规模上占据不同的位置。

    没有人能说 100% 纯净的价值是什么。用非 Smalltalk 的语言(包括 Python)编写非常好的面向对象代码是可能的。

    Python 在所有这些领域都很有用:科学 (NumPy)、网络 (Django) 和桌面。

    【讨论】:

      【解决方案5】:

      class-based programming 不需要访问修饰符(public、private、protected 等)。它们只是一个功能,例如multiple inheritance

      【讨论】:

        【解决方案6】:

        究竟什么是完全面向对象? Alan Kay 说:“实际上,我编造了‘面向对象’这个术语,我可以告诉你,我并没有想到 C++。”。诚然,他可能也没有想到 python,但值得注意的是,Smalltalk 也按约定保护类,没有强制要求。

        【讨论】:

          【解决方案7】:

          我相信 Python 更像是一种非常实用、实用的语言。

          为开发人员提供价值的概念被放入,而没有过多考虑诸如“正确的面向对象设计”之类的神学概念。这是一种适合有实际工作要做的人的语言。

          我认为 Python 适合各种环境,虽然 Desktop 由于缺乏单一框架而有点困难。对于所有应用程序,使用框架都很方便, 比如用于计算的 NumPy,用于 Web 的 Twisted 或 Django,以及用于桌面的 WxWidgets 或其他。

          【讨论】:

          • 实际上有很多用 Python 编写的 GNOME 软件,我自己写了一个 11k 行的代码,代码可读性和可维护性非常好,开发速度也非常快,并且有绑定几乎所有东西。但不得不承认,GTK有时候真的很麻烦。
          • PyQT 是要走的路!诺基亚的 PySlide 甚至更好。由于 LGPL,QT 现在也适用于业务 感谢诺基亚!
          • 在对象接口中包含字段是全部但很实用,它使重构成为一场噩梦。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多