2012-02-08 17 views
16

Asıl sorusu çok belirsizdi ve "yapıcı değil" şeklinde kapatıldı. Bu nedenle, daha önce gönderilmiş olan cevaplara cevap verecek şekilde soruyu gözden geçireceğim. :-)Moose, Python'un OO sistemine nasıl benziyor?

Perl'in Moose OO çerçevesi Moose ve Python'un stok OO çerçevesi arasındaki farklarla ilgileniyorum. İlk karşılaştırma noktası olarak, birkaç öznitelik ve bir avuç yöntemle basit bir sınıf oluşturmak ne kadar kolay?

Şimdi, bu soru tekrar açılırsa, şunu da bilmek isterim: "Salt okunur" özelliğini kullanmaya karar verirsek, gelecekte kodu yeniden kodlamak ne kadar kolay? Diğer bir deyişle, bir niteliğin okunabilir ve yazılabilir olmasının sadece okunmaya dönüştürülmesini sağlamak için hangi adımları atmam gerekir? (Biliyorum, bir API'yi değiştirmek kötüdür, ama içsel bir şey üzerinde çalıştığımı varsayalım ve benim uygulama ortasında bir özniteliğin gerçekten okunması gerektiğini düşünelim.)

+2

Perl'in orijinal nesne sisteminin çoğunu Python'dan aldığını düşünerek bu çok eğlenceli. Python'un harika dediği çok ilginç bir manzara. – tsee

+1

Bu yorum son düzenlemem ışığında bir anlam ifade etmiyor. Aslında, Python'un OO'sunun harika olduğunu duyduğumu söyledim. Bununla kastettiğim şey "Python sözdizimsel şeker sağlar, böylece bir sınıf yaratmak çok kolay." –

+2

@David Mertens: Düzenlemenizle ilgili - Okuma/yazma işlevinden salt okunur bir niteliği değiştirmek kolaydır. Örneğin için. change 'someattr => (= = 'rw');' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''}}} Örneğin. $ x-> someattr ("foo"); '(setter) bir hata verirken $ x-> someattr (getter) iyidir. – draegtun

cevap

11

Her ikisini de kullanmadan, Moose's büyük güç onun kısalığıdır. Moose ile

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; 

: klasik perl OO karşılaştırın

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; 

Ve hemen hemen satılır değilim, ama Moose sadece başlangıç ​​oluyor. Ben bir sonraki favori özelliği Types olduğunu düşünüyorum, bu büyük bir kod tabanı üzerinde bir programı gerçekten basitleştirebilir ve kötü bir hata tüm dizi durdurabilir. Örneğin, bir nesnenin belirli bir özelliğinin bazı durumlarda bir Tarih olduğu, ancak diğerlerinde bir tarihi temsil eden bir dizenin (aslında Python'u kodlarken) diğer gün tarafından ısırıldım.

Python için herhangi bir alternatif OO sistemi duymadım.

+1

OO için OO temel bir dil kalitesi olarak baştan beri OO, python için alternatif bir OO sistemi gereksiz olurdu. Perl daha sonradan daha fazla idi.Böylece Perl, özellikle Perl'in ve Python'un temel OO modellerinin * aynı * olduğu ve Python'un 'mülkünün 'daha sonradan eklenen bir Python oyunu olduğu düşünülürse, OO – jdi

+8

@jdi nonsense hakkında paketler ve uzantılar getirilmesini gerektirir. DFS MRO ve daha sonra C3, vb. Yeniden donatıldı – hobbs

+6

Jdi - Aslında ilk başta böyle bir şey yazdım ama onu sildim çünkü IMO'yu karşılaştırmak, Moose mal ve mülkleri yazmak gibi şeylerdeki hisse senedi python OO'nun oldukça ilerisinde. (ama bu sadece statik yazım için önyargı olabilir.) –

3

Python'un OO gücü muhtemelen yaygınlığındadır. Yani, yerleşik OO sistemi bu kadar basit ve sözdizimi o kadar da ulaşılabilir ki, baskın Python programlama paradigmasının uzak ve uzağında.

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' 

Bu sürüm değerlerine erişim için Alıcılar ve ayarlayıcılar tanımlar: Örneğin, Todd Gardner'ın ilk "Kişi" Örneğin kaba eşdeğer gibi işe yarayabilecek

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 ve Perl kabaca eşdeğerdir güç, esneklik ve ifade gücü. Birinde bir şeyler yapabiliyorsanız, muhtemelen benzer bir şekilde diğerinde yapabilirsiniz. Bununla birlikte, Python'un basit OO tasarımında açık bir avantajı olduğunu düşünüyorum - herhangi bir alternatif nesne modelinin önemli bir çekiş elde etmesinin bir nedeni olmadı.

+1

teşekkürler. Tood Gardner'ın tepkisi ile birleştiğinde, basit bir yan yana karşılaştırmaya sahibiz ve Moose ve Python OO da aynı şeyi görüyor. –

+4

Moose'da, temel alıcılar ve ayarlayıcıları ücretsiz edinirsiniz: "$ me = Kişi-> yeni; $ me-> first_name (" Jack "); $ me-> last_name (" Maney "); nitelikleri, salt okunur olarak kutusundan çıkar (ve salt okunur özniteliğin değerini değiştirmeye çalışırsanız bir hata atılır), örn. 'ssn' => (isa => 'Str', = = 'ro') Ayrıca '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '[' '] ile özel alıcı ve ayarlayıcı isimlerini bile belirtebilirsiniz. Attributes.pod). –

+2

* Önemli bir çekiş * kazanmış gibi görünmese de, Bullwinkle adı verilen Moose to Python alt kümesini sağlayan bir port vardır: http://pypi.python.org/pypi/bullwinkle – draegtun

İlgili konular