2009-05-27 23 views
16

Básicamente, me pregunto si Python tiene alguna falla en OOP como hace PHP. PHP ha estado desarrollando sus prácticas de OOP para las últimas versiones. Está mejorando en PHP, pero aún no es perfecto. Soy nuevo en Python y me pregunto si el soporte OOP de Python es mejor o simplemente comparable.¿Cómo se compara Python OOP con PHP OOP?

Si hay algunos problemas en Python OOP que no siguen las prácticas de POO adecuadas, definitivamente me gustaría saberlos. PHP, por ejemplo, no permite la herencia múltiple, hasta donde yo sé.

Gracias a todos!

Edit: ¿Qué hay de soporte para público y privado? o soporte de tipos variables. Creo que estos son importantes con respecto a la construcción de software OOP.

+15

¿Desde cuándo es la herencia múltiple "OOP adecuado"? Java no es compatible con herencia múltiple. ¿Cuál es su estándar para "OOP apropiado"? ¿Puedes proporcionar enlaces o una definición? –

+1

Depende de lo que defina como "correcto". Muchos lenguajes OOP (Java, Objective-C, C#) no permiten la herencia múltiple. – Nosredna

+2

PHP no permite herencia múltiple por diseño. Python probablemente siga esta práctica también. Es común en la mayoría de los lenguajes OOP modernos, ya que la herencia múltiple puede provocar muchos dolores de cabeza ya que la mayoría de las personas no la usan correctamente. –

Respuesta

21

Diría que el soporte de OOP de Python es mucho mejor dado que se introdujo en el lenguaje en su infancia en comparación con PHP que atornilló OOP en un modelo de procedimiento existente.

+0

Interesante. Pensé que las clases se agregaron relativamente tarde en el desarrollo de Python, pero una lectura del blog de Guido dice que se agregó antes del primer lanzamiento público. –

+0

Jason: Han sido revisados ​​sin embargo. – troelskn

+0

1+ para Python. OOP en PHP es un desastre. No estoy tratando de promocionar Python a otros desarrolladores (es decir, menos trabajo para mí) pero comencé con PHP y después de codificar en Python no tomaría un proyecto PHP por menos de 5 veces su costo real (es decir, una pequeña dinámica sitio web en CodeIgniter por 50k, sin exageración). Nadie pagaría tanto, así que creo que entiendes la imagen. – orokusaki

3

Creo que son comparables en este momento. Como una prueba simple, dudo que haya algún patrón en Design Patterns o Patterns of Enterprise Application Architecture, posiblemente los dos libros más influyentes en OOP, que es imposible de implementar en ninguno de los dos idiomas.

Ambos idiomas han llegado a pasos agigantados desde sus infancias.

En cuanto a la herencia múltiple, a menudo es creates more problems than it solves, y en estos días, comúnmente se deja fuera de los idiomas como una decisión de diseño intencional.

+9

También puede implementar cualquier patrón de diseño en C. ¿Está C orientado a objetos como ¿Pitón? –

+0

Um. El enlace al artículo de Wikipedia describe los problemas que MI tiene, y cómo se tratan en varios idiomas. La solución de Python (el MRO) también se describe en el artículo. No estoy seguro de lo que logras al vincular al artículo. – tzot

8

El soporte OOP de Python es muy fuerte; sí permite herencia múltiple, y todo es manipulable como un objeto de primera clase (incluidas clases, métodos, etc.).

El polimorfismo se expresa mediante el tipado de pato. Por ejemplo, puede iterar sobre una lista, una tupla, un diccionario, un archivo, un recurso web y más, todo de la misma manera.

Hay un montón de pequeñas cosas pedantes que son debatiblemente no OO, como obtener la longitud de una secuencia con len (lista) en lugar de list.len(), pero es mejor no preocuparse por ellos.

+6

Por "debatably not OO" ¿te refieres a "no típica sintaxis OO?" Es claramente OO, ya que es el método __len__ del objeto. –

+3

@S. Lott: sospecho que eso es exactamente lo que quiere decir. La implementación es correctamente OO, pero la sintaxis no lo es. La longitud de la secuencia es un aspecto del objeto secuencia; idealmente, la sintaxis del lenguaje lo expresaría de esa manera. –

+3

@Ben: ¿No es la implementación más importante que la sintaxis? ¿O considera que el operador está sobrecargando "OOP no apropiado", porque la sintaxis es incorrecta? ¿Preferiría 1.minus() a -1 porque es más OO? Realmente no veo cómo las personas pueden quejarse sobre el problema de len. – nikow

3

También: Python tiene sobrecarga de operador nativa, a diferencia de PHP (aunque sí existe una extensión). Lo amo o lo odio, está allí.

1

Si está buscando un OOP "más puro", debería estar mirando SmallTalk y/o Ruby.

PHP ha crecido considerablemente con su compatibilidad con OOP, pero debido a la forma en que funciona (vuelve a cargar todo cada vez), las cosas pueden volverse realmente lentas si se siguen las mejores prácticas de OOP. Que es una de las razones por las que no escuchas mucho sobre PHP en Rails.

+0

Y también porque las capacidades de metaprogramación de PHP no pueden coincidir con las de Ruby o Smalltalk, o incluso con las de Python. –

7

Un aspecto del modelo de OOP de Python que es inusual es su mecanismo de encapsulación. Básicamente, Python supone que los programadores no hacen cosas malas, por lo que no se esfuerza en modo alguno para proteger variables o métodos de miembros privados.

Funciona mediante el tratamiento de nombres de miembros que comienzan con dos guiones bajos y terminan con menos de dos. Dichos identificadores se cambian en todas partes para que tengan el nombre de clase antepuesto, con un guión bajo adicional antes de eso.así:

class foo: 
    def public(self): 
     return self.__private() 
    def __private(self): 
     return 5 

print foo().public() 
print foo()._foo__private() 

nombres comenzando y terminando con dos (o más) de subrayado no son mutilados, por lo __init__ la pitón método utiliza para la construcción de nuevos casos, se deja solo.

Aquí hay un link que lo explica con más detalle.

+0

Otra manera: los nombres que comienzan con dos guiones bajos (y que terminan con menos de 2 guiones bajos) están destrozados, pero otros nombres no lo son. – mipadi

+0

@TokenMacGuy: por favor, corrija su respuesta en lugar de decir que está "un poco mal." Las propiedades de –

+1

se pueden usar para controlar cómo se accede a los atributos. Pero a veces me gustaría tener verdaderos atributos privados. –