2012-02-08 9 views
16

Mi pregunta original era demasiado vaga y fue "cerrada como no constructiva". Como tal, revisaré la pregunta para que atienda las respuestas que ya se han publicado. :-)¿Cómo se compara Moose con el sistema OO de Python?

Estoy interesado en las diferencias entre el framework Moose OO de Perl Moose y el framework OO de Python. Como primer punto de comparación, ¿qué tan fácil es crear una clase simple con un par de atributos y un puñado de métodos?

Ahora, si esta pregunta se vuelve a abrir, también me gustaría saber: ¿Qué tan fácil es refactorizar el código en el futuro si decido hacer un atributo de "solo lectura"? En otras palabras, ¿qué pasos debo tomar para que un atributo deje de ser legible y escribible para que sea de solo lectura? (Lo sé, es malo cambiar una API, pero supongamos que estoy trabajando en algo internamente y me doy cuenta en el medio de mi implementación de que un atributo debería ser de solo lectura.)

+2

Esto es hilarante teniendo en cuenta que Perl tomó gran parte de su sistema de objetos original de Python. Llamar a Python es genial es una visión muy curiosa. – tsee

+1

Este comentario no tiene ningún sentido a la luz de mi última edición. Originalmente, dije que había escuchado que el OO de Python es genial. Lo que quise decir con eso es que "Python proporciona azúcar sintáctico para que crear una clase sea realmente fácil". –

+2

@David Mertens: en cuanto a su edición: cambiar un atributo de lectura/escritura para leer solo es fácil. Por ej. change 'tiene someattr => (is => 'rw');' to 'tiene someattr => (is => 'ro');' Después de este cambio, todos los intentos de escribir en el atributo darán un error de tiempo de ejecución, para p.ej. '$ x-> someattr (" foo ");' (setter) arrojaría un error mientras que '$ x-> someattr' (getter) está bien. – draegtun

Respuesta

11

De haber usado ambos, Moose's gran fortaleza es su brevedad. Comparar clásico OO Perl:

package Person; 
use strict; 
use warnings; 

sub new { 
    my $self = {}; 
    my $class = ref($proto) || $proto; 
    $self->{FIRST_NAME} = undef; 
    $self->{LAST_NAME} = undef; 
    bless ($self, $class); 
    return $self; 
} 

sub first_name { 
    my $self = shift; 
    if (@_) { $self->{FIRST_NAME} = shift } 
    return $self->{FIRST_NAME}; 
} 

sub last_name { 
    my $self = shift; 
    if (@_) { $self->{LAST_NAME} = shift } 
    return $self->{LAST_NAME}; 
} 

1; 

con Moose:

package Person; 
use Moose; 
use namespace::autoclean; 

has 'first_name' => (is => 'rw', isa => 'Str',); 
has 'last_name' => (is => 'rw', isa => 'Str',); 

__PACKAGE__->meta->make_immutable; 
1; 

Y estoy más o menos vendido, pero Moose es sólo conseguir comienzo. Creo que mi siguiente característica favorita fue Types, que realmente podría simplificar un programa en una gran base de código y detener toda una serie de errores desagradables. Por ejemplo, habría sido muy bien manejado uno me picaron el otro día (mientras codificaba Python, en realidad) donde cierta propiedad de un objeto era una Fecha en algunos casos, pero una cadena que representa una fecha en otros.

No he oído hablar de ningún sistema OO alternativo para python.

+1

Me parece que un sistema OO alternativo para python sería innecesario ya que OO era una cualidad fundamental del lenguaje desde el principio, mientras que OO para Perl fue más una ocurrencia tardía.Por lo tanto, Perl requiere envoltorios y extensiones para producir OO – jdi

+8

@jdi sin sentido, especialmente dado que los modelos básicos OO de Perl y Python son * los mismos *, y la 'propiedad 'de Python, por ejemplo, fue una idea añadida añadida al final del juego, Python solía tener DFS MRO y luego modernizado C3, etc. – hobbs

+6

@jdi - De hecho, escribí algo así al principio, pero lo borré porque comparando los dos, IMO, Moose está muy por delante de stock python OO en cosas como haber escrito propiedades y enumeraciones (pero eso podría ser solo mi predisposición al tipado estático.) –

3

La fuerza de OO de Python es probablemente en su omnipresencia. Es decir, el sistema integrado OO es tan simple y la sintaxis es tan accesible que es, por lejos, el paradigma de programación dominante de Python. Por ejemplo, el equivalente aproximado de primer ejemplo "Persona" de Todd Gardner podría funcionar como:

class Person: 
    def __init__(self): 
     self.firstname = None 
     self.lastname = None 

me = Person() 
me.firstname = 'Kirk' # These two lines update instance attributes 
me.lastname = 'Strauser' 

Esta versión define captadores y definidores para acceder a los valores:

class AnotherPerson: 
    def __init__(self): 
     self._firstname = None 
     self._lastname = None 

    @property 
    def firstname(self): 
     return self._firstname 

    @firstname.setter 
    def firstname(self, newname): 
     self._firstname = newname 

    @property 
    def lastname(self): 
     return self._lastname 

    @lastname.setter 
    def lastname(self, newname): 
     self._lastname = newname 

you = AnotherPerson() 
you.firstname = 'David' # These two lines call instance methods 
you.lastname = 'Mertens' 

Python y Perl son aproximadamente equivalentes en poder, flexibilidad y expresividad. Si puedes hacer algo en uno, probablemente puedas hacerlo de manera similar en el otro. Sin embargo, creo que Python tiene una clara ventaja en el diseño de OO simple, hasta el punto de que no existe una razón para que los modelos de objetos alternativos ganen una tracción significativa.

+1

gracias. En combinación con la respuesta de Tood Gardner, tenemos una comparación simple de lado a lado y Moose y Python OO tienen el mismo aspecto. –

+4

En Moose, obtienes getters y setters básicos gratis: 'my $ me = Person-> new; $ me-> first_name (" Jack "); $ me-> last_name (" Maney ");' Incluso puedes establecer atributos como de solo lectura desde el primer momento (y se produce un error si intenta cambiar el valor de un atributo de solo lectura), por ejemplo, 'tiene 'ssn' => (isa => 'Str', is => 'ro'); 'Además, [incluso puede especificar nombres getter y setter personalizados a través de las opciones' reader' y 'writer'] (http://search.cpan.org/dist/Moose/lib/Moose/Manual/ Attributes.pod). –

+2

Aunque no parece haber ganado * una tracción significativa * hay un puerto que proporciona un subconjunto de Moose a Python llamado Bullwinkle: http://pypi.python.org/pypi/bullwinkle – draegtun

Cuestiones relacionadas