2009-04-03 10 views
14

Para mi sorpresa, estoy desarrollando más interés hacia los lenguajes dinámicos como Ruby y Python. La afirmación es que están 100% orientados a objetos, pero a medida que leo en varios conceptos básicos como interfaces, sobrecarga de métodos, sobrecarga de operadores faltan. ¿Está de alguna manera incorporado bajo la cubierta o estos idiomas simplemente no lo necesitan? Si lo último es verdad, ¿están 100% orientados a objetos?¿Por qué los lenguajes dinámicos como Ruby y Python no tienen el concepto de interfaces como en Java o C#?

EDITAR: Basado en algunas respuestas, veo que la sobrecarga está disponible tanto en Python como en Ruby, ¿es el caso en Ruby 1.8.6 y Python 2.5.2?

+0

No recuerdo que la sobrecarga del método o la sobrecarga del operador sean un requisito para un idioma OO. Sin embargo, he escuchado el argumento de que no son OO. –

+0

De todos los idiomas que menciona, Java es el único sin sobrecarga del operador. Y la sobrecarga de métodos no está relacionada con OOP; C tiene sobrecarga de método. – Pesto

+0

Puede sobrecargar operadores en Ruby 1,8,6 –

Respuesta

18

Gracias al enlace posterior, no lo necesitan. En Java/C#, las interfaces se utilizan para declarar que alguna clase tiene ciertos métodos y se comprueba durante el tiempo de compilación; en Python, si un método existe se verifica durante el tiempo de ejecución.

sobrecarga de métodos en Python funciona:

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

Están orientados a objetos? Yo diría que sí. Es más una cuestión de aproximación que si cualquier lenguaje concreto tiene la característica X o la característica Y.

+18

Disculpe que no se sobrecarga el método. Lo que estás haciendo allí es el método que prevalece. La sobrecarga de método/función es la capacidad de reutilizar el mismo nombre pero con una firma diferente como en: func a (String a); func a (Int a) ;. En su ejemplo, utiliza un método con la misma firma, pero anulado en una subclase. [Wikipedia - Sobrecarga] (http://en.wikipedia.org/wiki/Function_overloading) y [Wikipedia - Overriding] (http://en.wikipedia.org/wiki/Method_overriding) – dryajov

18

Los idiomas dinámicos usan duck typing. Cualquier código puede llamar a métodos en cualquier objeto que admita esos métodos, por lo que el concepto de interfaces es extraño. Python de hecho es compatible con operator overloading, al igual que Ruby.

De todos modos, parece que se está centrando en aspectos que no son esenciales para object oriented programming. El foco principal está en conceptos como encapsulación, herencia y polimorfismo, que son 100% compatibles con Python y Ruby.

5

sólo puedo hablar por pitón, pero no have been proposals for interfaces, así como ejemplos de interfaz de casas-escrito en el pasado.

Sin embargo, la manera en que python trabaja con objetos dinámicamente tiende a reducir la necesidad de (y el beneficio de) las interfaces hasta cierto punto.

Con un lenguaje dinámico, su vinculación de tipo ocurre en el tiempo de ejecución; las interfaces se utilizan principalmente para restricciones de tiempo de compilación en objetos; si esto sucede en tiempo de ejecución, elimina parte de la necesidad de interfaces.

2

name based polymorphism

"Para aquellos que no están familiarizados con Python, he aquí una rápida introducción al polimorfismo basado en nombre. Objetos de Python tienen un diccionario interno que contiene una cadena para cada atributo y método. Al acceder a un atributo o método en código Python, Python simplemente busca la cadena en el dict. Por lo tanto, si lo que quieres es una clase que funcione como un archivo, no necesitas heredar de un archivo, solo creas una clase que tenga los métodos de archivo que se necesitan.

Python también define un conjunto de métodos especiales que se invocan con la sintaxis adecuada. Por ejemplo, a + b es equivalente a. agregar (b). Hay algunos lugares en las partes internas de Python donde manipula directamente objetos incorporados, pero el polimorfismo basado en nombres funciona como espera el 98% del tiempo. "

1

Python proporciona sobrecarga de operadores, por ejemplo, se puede definir un método __add__ si quieres sobrecargar +.

Normalmente no necesita proporcionar sobrecarga de método, ya que puede pasar parámetros arbitrarios en un único método. En muchos casos, ese único método puede tener un único cuerpo que funcione para todo tipo de objetos de la misma manera. Si desea tener un código diferente para diferentes tipos de parámetros, puede inspeccionar el tipo o el doble despacho.

Las interfaces son en su mayoría innecesarias debido a la tipificación de pato, como señala rossfabricant. Unos pocos casos restantes están cubiertos en Python por ABC (clases base abstractas) o interfaces Zope.

Cuestiones relacionadas