令我惊讶的是,我对 Ruby 和 Python 等动态语言越来越感兴趣。声称它们是 100% 面向对象的,但是当我读到接口、方法重载、运算符重载等几个基本概念时,它们都缺失了。它是以某种方式内置在封面下,还是这些语言不需要它?如果后者是真的,他们是 100% 面向对象的吗?
编辑:根据一些答案,我看到重载在 Python 和 Ruby 中都可用,在 Ruby 1.8.6 和 Python 2.5.2 中是这种情况吗?
令我惊讶的是,我对 Ruby 和 Python 等动态语言越来越感兴趣。声称它们是 100% 面向对象的,但是当我读到接口、方法重载、运算符重载等几个基本概念时,它们都缺失了。它是以某种方式内置在封面下,还是这些语言不需要它?如果后者是真的,他们是 100% 面向对象的吗?
编辑:根据一些答案,我看到重载在 Python 和 Ruby 中都可用,在 Ruby 1.8.6 和 Python 2.5.2 中是这种情况吗?
由于后期绑定,他们不需要它。在 Java/C# 中,接口用于声明某个类具有某些方法,并在编译时进行检查;在 Python 中,在运行时检查方法是否存在。
Python 中的方法重载确实有效:
>>> class A:
... def foo(self):
... return "A"
...
>>> class B(A):
... def foo(self):
... return "B"
...
>>> B().foo()
'B'
它们是面向对象的吗?我会说是的。这更像是一种方法,而不是任何具体语言是否具有特性X或特性Y。
我只能说python,但是过去已经有关于接口的建议以及家庭编写的接口示例。
然而,python 动态处理对象的方式往往会在一定程度上减少对接口的需求(以及接口的好处)。
使用动态语言,您的类型绑定发生在运行时 - 接口主要用于对象的编译时间约束 - 如果这发生在运行时,它消除了对接口的一些需求。
“对于那些不熟悉 Python 的人,这里是基于名称的多态性的快速介绍。Python 对象有一个内部字典,其中包含每个属性和方法的字符串。当您在 Python 代码中访问属性或方法时,Python 只需查找字典中的字符串。因此,如果你想要的是一个像文件一样工作的类,你不需要从文件继承,你只需创建一个具有所需文件方法的类。
Python 还定义了一堆特殊的方法,它们被适当的语法调用。例如,a+b 等价于 a。添加(b)。Python 内部有几个地方直接操作内置对象,但基于名称的多态性在大约 98% 的情况下按预期工作。"
Python确实提供了运算符重载,例如,__add__
如果你想重载+,你可以定义一个方法。
您通常不需要提供方法重载,因为您可以将任意参数传递给单个方法。在许多情况下,该单一方法可以有一个单一的主体,以相同的方式适用于所有类型的对象。如果您想为不同的参数类型使用不同的代码,您可以检查类型或双重调度。
正如 rossfabricant 指出的那样,由于鸭子类型,接口大多是不必要的。ABCs(抽象基类)或 Zope 接口在 Python 中涵盖了一些剩余的情况。