Interface 为什么像Ruby和Python这样的动态语言没有像Java或C#那样的接口概念?

Interface 为什么像Ruby和Python这样的动态语言没有像Java或C#那样的接口概念?,interface,oop,dynamic-languages,Interface,Oop,Dynamic Languages,令我惊讶的是,我对Ruby和Python等动态语言越来越感兴趣。声明是它们是100%面向对象的,但正如我读到的一些基本概念,如接口、方法重载、运算符重载,都不存在。它是在某种程度上隐藏的还是这些语言根本不需要它?如果后者是真的,那么它们是100%面向对象的吗 编辑:根据一些答案,我发现Python和Ruby中都可以使用重载,Ruby 1.8.6和Python 2.5.2中也是如此吗?由于后期绑定,它们不需要重载。在Java/C#中,接口用于声明某个类具有某些方法,并在编译时对其进行检查;在Pyt

令我惊讶的是,我对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和Ruby中得到100%的支持。

我只能说Python,但过去也有一些自己编写的接口示例

然而,python动态处理对象的方式在某种程度上倾向于减少对接口的需要(以及接口的好处)

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

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


Python还定义了一系列特殊的方法,这些方法由适当的语法调用。例如,a+b相当于a.添加(b)。Python内部有几个地方可以直接操作内置对象,但基于名称的多态性在98%的时间里都能正常工作。“

Python确实提供了运算符重载,例如,如果要重载+,可以定义一个方法
\uuuu\uuuu

您通常不需要提供方法重载,因为您可以将任意参数传递到单个方法中。在许多情况下,该单个方法可以有一个单独的主体,以相同的方式处理所有类型的对象。如果您希望为不同的参数类型提供不同的代码,可以检查该类型,或双重分派


正如Rossffabricant指出的那样,由于duck类型,接口基本上是不必要的或Zope接口。

我不记得方法重载或运算符重载是OO语言的一项要求。但是,我听说过它们不是OO。在你提到的所有语言中,Java是唯一没有运算符重载的语言。方法重载与OOP无关;C有方法重载。你可以重载Ruby 1,8,6PHP中的运算符确实有接口。很抱歉,这不是方法重载。您在那里做的是方法重写。方法/函数重载能够重用相同的名称,但具有不同的签名,如:func a(字符串a);func a(Int a)在您的示例中,您使用的方法具有相同的签名,但在子类中被重写。并且