2012-02-08 24 views
16

Câu hỏi ban đầu của tôi quá mơ hồ và bị "đóng cửa không mang tính xây dựng". Như vậy, tôi sẽ sửa đổi câu hỏi để nó đáp ứng các câu trả lời đã được đăng. :-)Làm thế nào để Moose so sánh với hệ thống OO của Python?

Tôi quan tâm đến sự khác biệt giữa khuôn khổ Moose OO của Perl Moose và khung OO cổ phiếu của Python. Là một điểm so sánh đầu tiên, việc tạo một lớp đơn giản với một vài thuộc tính và một số phương thức dễ dàng như thế nào?

Bây giờ, nếu câu hỏi này được mở lại, tôi cũng muốn biết: Mã tái cấu trúc trong tương lai dễ dàng như thế nào nếu tôi quyết định tạo thuộc tính "chỉ đọc"? Nói cách khác, tôi sẽ phải thực hiện các bước nào để thay đổi một thuộc tính khỏi khả năng đọc và ghi được để chỉ đọc? (Tôi biết, thật tệ khi thay đổi một API, nhưng hãy giả sử tôi đang làm việc trên một cái gì đó nội bộ và nhận ra ở giữa việc thực hiện của tôi rằng một thuộc tính thực sự phải là chỉ đọc.)

+2

Điều này thật thú vị khi xem xét rằng Perl đã lấy nhiều hệ thống đối tượng ban đầu của nó từ Python. Gọi là tuyệt vời của Python là một cái nhìn rất tò mò. – tsee

+1

Nhận xét này không có ý nghĩa gì về ánh sáng của bản chỉnh sửa mới nhất của tôi. Ban đầu, tôi đã nói rằng tôi đã nghe nói rằng OO của Python rất tuyệt vời. Điều tôi ngụ ý là "Python cung cấp cú pháp để tạo ra một lớp thực sự dễ dàng." –

+2

@David Mertens: Về chỉnh sửa của bạn - Để thay đổi thuộc tính từ đọc/ghi sang chỉ đọc thật dễ dàng. Ví dụ: thay đổi 'has someattr => (is => 'rw');' to 'có someattr => (is => 'ro');' Sau khi thay đổi tất cả các lần cố gắng ghi vào thuộc tính sẽ cho lỗi thời gian chạy, cho ví dụ. '$ x-> someattr (" foo ");' (setter) sẽ ném một lỗi trong khi '$ x-> someattr' (getter) là tốt. – draegtun

Trả lời

11

Từ khi sử dụng cả hai, Moose's sức mạnh lớn là nó ngắn gọn. Hãy so sánh cổ điển 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; 

với 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; 

Và tôi khá nhiều bán, nhưng Moose chỉ là nhận được bắt đầu. Tôi nghĩ tính năng yêu thích tiếp theo của tôi là Types, điều này thực sự có thể đơn giản hóa một chương trình trên một codebase lớn và ngăn chặn toàn bộ các lỗi khó chịu. Ví dụ, nó sẽ xử lý độc đáo một cái mà tôi bị cắn vào ngày hôm trước (trong khi mã hóa Python), nơi một thuộc tính nhất định của một đối tượng là một ngày trong một số trường hợp, nhưng một chuỗi biểu thị một ngày ở những người khác.

Chưa được nghe về bất kỳ hệ thống OO thay thế nào cho python.

+1

Dường như với tôi rằng một hệ thống OO thay thế cho python sẽ là không cần thiết vì OO là chất lượng cơ bản của ngôn ngữ ngay từ đầu, trong khi OO cho Perl đã suy nghĩ nhiều hơn.Do đó Perl yêu cầu trình bao bọc và phần mở rộng để mang về OO – jdi

+8

@jdi vô nghĩa, đặc biệt là các mô hình OO cơ bản của Perl và Python là * giống nhau *, và thuộc tính 'Python 'của Python là một phần sau được thêm vào cuối trò chơi, Python đã từng có DFS MRO và sau đó trang bị thêm C3, v.v. – hobbs

+6

@jdi - Tôi thực sự đã viết một cái gì đó như thế lúc đầu, nhưng tôi đã xóa nó vì so sánh hai, IMO, Moose là khá xa về phía trước của cổ phiếu python OO trong những thứ như đã gõ thuộc tính và enums (nhưng điều đó có thể chỉ là sự thiên vị của tôi đối với việc gõ tĩnh.) –

3

Sức mạnh OO của Python có lẽ là trong khả năng phổ biến của nó. Đó là, hệ thống OO tích hợp rất đơn giản và cú pháp rất dễ tiếp cận đến mức nó ở xa và xa mô hình lập trình Python chi phối. Ví dụ, tương đương sơ bộ đầu tiên "Person" dụ Todd Gardner có thể làm việc như:

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' 

phiên bản này quy định getter và setter để truy cập vào các giá trị:

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 và Perl là tương đương trong sức mạnh, tính linh hoạt và tính biểu cảm. Nếu bạn có thể làm một cái gì đó trong một, bạn có thể có thể làm điều đó tương tự như trong khác. Tuy nhiên, tôi nghĩ Python có lợi thế rõ ràng trong thiết kế OO đơn giản - đến mức không có lý do gì cho bất kỳ mô hình đối tượng thay thế nào để đạt được lực kéo đáng kể.

+1

cảm ơn. Kết hợp với phản ứng của Tood Gardner, chúng tôi có một so sánh đơn giản và Moose và Python OO trông giống nhau. –

+4

Trong Moose, bạn nhận được các getters và setters cơ bản miễn phí: 'my $ me = Person-> new; $ me-> first_name (" Jack "); $ me-> last_name (" Maney ");' Bạn thậm chí có thể đặt các thuộc tính là quyền chỉ đọc ra khỏi hộp (và một lỗi được ném nếu bạn cố gắng thay đổi giá trị của một thuộc tính chỉ đọc), ví dụ 'has 'ssn' => (isa => 'Str', là => 'ro'); 'Ngoài ra, [bạn thậm chí có thể chỉ định tên getter và setter tùy chỉnh thông qua tùy chọn' reader' và 'writer'] (http://search.cpan.org/dist/Moose/lib/Moose/Manual/ Attributes.pod). –

+2

Mặc dù nó dường như không đạt được * lực kéo đáng kể * có một cổng cung cấp một tập hợp con của Moose tới Python được gọi là Bullwinkle: http://pypi.python.org/pypi/bullwinkle – draegtun

Các vấn đề liên quan