也许我对我的信息约会,但我会帮助别人学习OOP语言,概念等。我想用动态的东西。我的想法是Python,但后来我读到它没有接口。学习OOP概念不是一个人需要知道的界面吗?
答案 0 :(得分:4)
我的想法是Python,但后来我读到它没有接口。
好吧,你可以在Python中使用接口。标准库有abc
模块,还有第三方模块,如PyProtocols(和Zope和Twisted等框架有类似的想法)。
关键是他们不是必需的,甚至不需要。你“想用动态的东西”?这就是动态的意思:函数接受具有正确接口的任何对象,而不需要在任何地方静态定义该接口,更不用说对象静态地声明它支持接口。
所以,当你问:
对于学习OOP概念,有人需要了解的界面吗?
答案是“不”。接口是某人需要知道才能学习 Java风格的OOP ,但这并不是某些人在学习OOP时需要知道的事情。
从另一个角度考虑这个问题:在Python中执行Javascript样式的OOP是可能的,但并不容易;就像在Java中一样,类对于Python来说太基本了。这会使Python和Java糟糕的OO语言和Javascript成为一个好的吗?没有;它只是使它们成为不同的OO语言。
monkut想知道“wtf是一个界面???”
接口(也称为协议,抽象基类,抽象类型,......)只是一种类型,可以用于静态和/或动态类型检查和/或切换,与类完全相同。
那么,有什么好处呢?好吧,从理论上讲,你永远不需要检查类型 - 这不仅仅是Python的禅宗的一部分,它也是核心OO教条的一部分 - 但在实践中有时你会这样做。因此,能够命名您的抽象类型,并声明一个类支持各种不同的抽象类型,可能很有用。
当然,你可以用普通的旧类来做到这一点,但是能够显式地声明类型是抽象的也可以帮助提高可读性和调试性。 PEP 3119以Python为中心的方式解释了基本原理。
但在像Java这样的语言中,还有两个好处。
首先,如果您有静态类型检查,则不能编写可以采用的单个函数,例如列表,元组,集合,冻结集或迭代器。但是你可以编写一个带有Iterable的函数,然后声明列表,元组等都提供了Iterable接口,然后一切都很好。 (在使用动态类型检查的语言中,鸭子类型已经为您处理了这一点 - 您的代码适用于任何具有__iter__
方法的对象,该方法返回的行为与您期望的行为相同。)
其次,如果你有静态数据成员布局和/或vtable样式方法覆盖机制,多重继承是非常棘手的。但是多重继承也非常有用。所以在Java中,接口就像一个类,但没有数据成员或方法实现,并且您可以从任意数量的接口继承,但只能从一个类继承。这为Java提供了多重继承的一些好处,没有任何问题。 (在使用动态数据成员和动态方法查找的语言中,只要你有一个合理的MRO算法,就像Python一样,你可以获得多重继承的所有好处,而不会出现任何问题。)