2012-02-08 17 views
16

मेरा मूल प्रश्न बहुत अस्पष्ट था और "रचनात्मक नहीं था"। इस प्रकार, मैं इस प्रश्न को संशोधित कर दूंगा ताकि वह उन उत्तरों को पूरा कर सके जो पहले से ही पोस्ट किए जा चुके हैं। :-)मूस पाइथन की ओओ प्रणाली की तुलना कैसे करता है?

मुझे पर्ल के मूस ओओ फ्रेमवर्क Moose और पायथन के स्टॉक ओओ फ्रेमवर्क के बीच अंतर में रूचि है। तुलना के पहले बिंदु के रूप में, कुछ विशेषताओं और कुछ तरीकों से सरल वर्ग बनाना कितना आसान है?

अब, यदि यह प्रश्न फिर से खोल दिया गया है, तो मैं यह भी जानना चाहूंगा: यदि मैं "केवल पढ़ने" के लिए एक विशेषता बनाने का निर्णय लेता हूं तो भविष्य में कोड को पुन: सक्रिय करना कितना आसान है? दूसरे शब्दों में, एक विशेषता को पढ़ने योग्य और लिखने योग्य होने के लिए केवल एक बदलाव को बदलने के लिए मुझे क्या कदम उठाने होंगे? (मुझे पता है, एपीआई को बदलना बुरा है, लेकिन मान लें कि मैं आंतरिक रूप से कुछ पर काम कर रहा हूं और अपने कार्यान्वयन के बीच में महसूस कर रहा हूं कि एक विशेषता वास्तव में केवल पढ़ने के लिए ही जानी चाहिए।)

+2

यह उल्लसित है कि पर्ल ने पाइथन से अपनी मूल वस्तु प्रणाली को अधिकतर लिया है। पाइथन के महान कॉलिंग एक बहुत ही उत्सुक दृश्य है। – tsee

+1

यह टिप्पणी मेरे नवीनतम संपादन के प्रकाश में कोई समझ नहीं लेती है। मूल रूप से, मैंने कहा कि मैंने सुना था कि पायथन का ओओ महान है। मेरा मतलब यह है कि "पायथन सिंटैक्टिक चीनी प्रदान करता है ताकि कक्षा बनाना वास्तव में आसान हो।" –

+2

@ डेविड मर्टेंस: आपके संपादन के बारे में - पढ़ने के लिए पढ़ने/लिखने से एक विशेषता को बदलने के लिए केवल आसान है। उदाहरण के लिए। बदलें 'है someattr => (is =>' rw '); 'to' में someattr => (is =>' ro ') है;' इस परिवर्तन के बाद विशेषता को लिखने के सभी प्रयास एक रन-टाइम त्रुटि देंगे, के लिए जैसे। '$ x-> someattr (" foo ");' (सेटर) एक त्रुटि फेंक देगा जबकि '$ x-> someattr' (गेटर) ठीक है। – draegtun

उत्तर

11

दोनों का उपयोग करने से, मूस बड़ी ताकत यह शराब है। क्लासिक पर्ल OO की तुलना करें:

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; 

मूस के साथ:

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; 

और मैं काफी बेचा हूँ, लेकिन मूस बस शुरू हो रही है। मुझे लगता है कि मेरी अगली पसंदीदा विशेषता Types थी, जो वास्तव में एक बड़े कोडबेस पर एक प्रोग्राम को सरल बना सकती है और पूरी तरह से खराब कीड़े को रोक सकती है। मिसाल के तौर पर, यह अच्छी तरह से संभाला जाएगा जिसे मैंने दूसरे दिन काट दिया था (वास्तव में पाइथन कोडिंग करते समय) जहां किसी ऑब्जेक्ट की एक निश्चित संपत्ति कुछ मामलों में एक तिथि थी, लेकिन एक स्ट्रिंग दूसरों में एक तिथि का प्रतिनिधित्व करती थी।

पायथन के लिए किसी भी वैकल्पिक ओओ सिस्टम के बारे में नहीं सुना है।

+1

ऐसा लगता है कि पाइथन के लिए एक वैकल्पिक ओओ सिस्टम अनावश्यक होगा क्योंकि ओओ शुरुआत से भाषा की मौलिक गुणवत्ता थी, जबकि ओओ पर्ल एक विचारधारा के अधिक था।इस प्रकार पर्ल को ओओ – jdi

+8

@jdi बकवास लाने के लिए रैपर और एक्सटेंशन की आवश्यकता होती है, विशेष रूप से यह देखते हुए कि पर्ल और पायथन के मूल ओओ मॉडल * वही * हैं, और उदाहरण के लिए पायथन की 'संपत्ति' एक खेल के बाद देर से जोड़ा गया था, पायथन का इस्तेमाल होता था डीएफएस एमआरओ और बाद में पुनःप्राप्त सी 3, आदि – hobbs

+6

@jdi - मैंने वास्तव में पहले ऐसा कुछ लिखा था, लेकिन मैंने इसे मिटा दिया क्योंकि दो, आईएमओ की तुलना में, मूस स्टॉक पाइथन ओओ से काफी दूर है जैसे कि टाइप किए गए गुण और enums (लेकिन यह स्थिर टाइपिंग की ओर मेरी पूर्वाग्रह हो सकती है।) –

3

पायथन की ओओ शक्ति शायद इसकी व्यापकता में है। यही है, अंतर्निहित ओओ सिस्टम इतना आसान है और सिंटैक्स इतना ही पहुंच योग्य है कि यह प्रमुख पायथन प्रोग्रामिंग प्रतिमान दूर और दूर है। उदाहरण के लिए, टोड गार्डनर के पहले "व्यक्ति" उदाहरण के किसी न किसी बराबर काम कर सकते हैं की तरह:

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' 

इस संस्करण मूल्यों तक पहुँचने के लिए getters और setters परिभाषित करता है:

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' 

पायथन और पर्ल में मोटे तौर पर बराबर हैं बिजली, लचीलापन, और अभिव्यक्ति। यदि आप एक में कुछ कर सकते हैं, तो आप शायद इसे दूसरे में भी कर सकते हैं। हालांकि, मुझे लगता है कि पाइथन को सरल ओओ डिज़ाइन में स्पष्ट लाभ है - इस बिंदु पर कि किसी भी वैकल्पिक ऑब्जेक्ट मॉडल को महत्वपूर्ण कर्षण प्राप्त करने का कोई कारण नहीं है।

+1

धन्यवाद। टुड गार्डनर की प्रतिक्रिया के साथ, हमारे पास एक साधारण साइड-बाय-साइड तुलना है और मूस और पायथन ओओ इसके बारे में दिखते हैं। –

+4

मूस में, आपको मूल गेटर्स और सेटर्स मुफ्त में मिलते हैं: 'मेरा $ me = व्यक्ति-> नया; $ me-> first_name ("जैक"); $ me-> last_name ("मैनी");' आप भी सेट कर सकते हैं बॉक्स के बाहर केवल पढ़ने योग्य के रूप में गुण (और यदि आप केवल-पढ़ने योग्य विशेषता के मान को बदलने का प्रयास करते हैं तो एक त्रुटि फेंक दी जाती है), उदाहरण के लिए 'है' एसएसएन '=> (isa =>' Str ', = = है 'ro'); 'इसके अलावा, [आप' पाठक 'और' लेखक 'विकल्पों के माध्यम से कस्टम गेटर और सेटर नाम भी निर्दिष्ट कर सकते हैं] (http://search.cpan.org/dist/Moose/lib/Moose/Manual/ Attributes.pod)। –

+2

हालांकि यह * महत्वपूर्ण कर्षण प्राप्त नहीं हुआ है * वहां एक बंदरगाह है जो मूव को पाउथन को बुल्विंकल नामक एक सबसेट प्रदान करता है: http://pypi.python.org/pypi/bullwinkle – draegtun