16

令我惊讶的是,我对 Ruby 和 Python 等动态语言越来越感兴趣。声称它们是 100% 面向对象的,但是当我读到接口、方法重载、运算符重载等几个基本概念时,它们都缺失了。它是以某种方式内置在封面下,还是这些语言不需要它?如果后者是真的,他们是 100% 面向对象的吗?

编辑:根据一些答案,我看到重载在 Python 和 Ruby 中都可用,在 Ruby 1.8.6 和 Python 2.5.2 中是这种情况吗?

4

5 回答 5

18

由于后期绑定,他们不需要它。在 Java/C# 中,接口用于声明某个类具有某些方法,并在编译时进行检查;在 Python 中,在运行时检查方法是否存在。

Python 中的方法重载确实有效:

>>> class A:
...  def foo(self):
...    return "A"
...
>>> class B(A):
...  def foo(self):
...    return "B"
...
>>> B().foo()
'B'

它们是面向对象的吗?我会说是的。这更像是一种方法,而不是任何具体语言是否具有特性X或特性Y

于 2009-04-03T20:29:11.870 回答
18

动态语言使用鸭子类型。任何代码都可以在支持这些方法的任何对象上调用方法,因此接口的概念是无关紧要的。Python 确实支持运算符重载(检查 - 3.3. 特殊方法名称),Ruby也是如此。

无论如何,您似乎专注于对面向对象编程不重要的方面。主要关注的是封装、继承和多态等概念,Python 和 Ruby 100% 支持这些概念。

于 2009-04-03T20:30:36.500 回答
7

我只能说python,但是过去已经有关于接口的建议以及家庭编写的接口示例。

然而,python 动态处理对象的方式往往会在一定程度上减少对接口的需求(以及接口的好处)。

使用动态语言,您的类型绑定发生在运行时 - 接口主要用于对象的编译时间约束 - 如果这发生在运行时,它消除了对接口的一些需求。

于 2009-04-03T20:31:48.430 回答
2

基于名称的多态性

“对于那些不熟悉 Python 的人,这里是基于名称的多态性的快速介绍。Python 对象有一个内部字典,其中包含每个属性和方法的字符串。当您在 Python 代码中访问属性或方法时,Python 只需查找字典中的字符串。因此,如果你想要的是一个像文件一样工作的类,你不需要从文件继承,你只需创建一个具有所需文件方法的类。

Python 还定义了一堆特殊的方法,它们被适当的语法调用。例如,a+b 等价于 a。添加(b)。Python 内部有几个地方直接操作内置对象,但基于名称的多态性在大约 98% 的情况下按预期工作。"

于 2009-04-03T20:34:00.920 回答
1

Python确实提供了运算符重载,例如,__add__如果你想重载+,你可以定义一个方法。

您通常不需要提供方法重载,因为您可以将任意参数传递给单个方法。在许多情况下,该单一方法可以有一个单一的主体,以相同的方式适用于所有类型的对象。如果您想为不同的参数类型使用不同的代码,您可以检查类型或双重调度。

正如 rossfabricant 指出的那样,由于鸭子类型,接口大多是不必要的。ABCs(抽象基类)或 Zope 接口在 Python 中涵盖了一些剩余的情况。

于 2009-04-03T20:34:42.090 回答