2009-05-27 16 views
16

मैं मूल रूप से सोच रहा हूं कि क्या पाइथन की PHP की तरह कोई ओओपी कमियां हैं। PHP पिछले कुछ संस्करणों के लिए अपने ओओपी प्रथाओं का विकास कर रहा है। यह PHP में बेहतर हो रहा है लेकिन यह अभी भी सही नहीं है। मैं पाइथन के लिए नया हूं और मैं बस सोच रहा हूं कि पाइथन का ओओपी समर्थन बेहतर है या तुलनीय है।पाइथन ओओपी PHP ओओपी की तुलना कैसे करता है?

यदि पाइथन ओओपी में कुछ समस्याएं हैं जो उचित ओओपी प्रथाओं का पालन नहीं करती हैं तो मैं निश्चित रूप से उन लोगों को जानना चाहूंगा। उदाहरण के लिए PHP, जहां तक ​​मुझे पता है, कई विरासतों की अनुमति नहीं देता है।

धन्यवाद सबको!

संपादित करें: सार्वजनिक और निजी के लिए समर्थन के बारे में कैसे? या परिवर्तनीय प्रकार का समर्थन। मुझे लगता है कि ओओपी सॉफ्टवेयर बनाने के संबंध में ये महत्वपूर्ण हैं।

+15

चूंकि एकाधिक विरासत "उचित ओओपी" कब है? जावा एकाधिक विरासत का समर्थन नहीं करता है। "उचित ओओपी" के लिए आपका मानक क्या है? क्या आप लिंक या परिभाषा प्रदान कर सकते हैं? –

+1

यह उस पर निर्भर करता है जिसे आप "उचित" के रूप में परिभाषित करते हैं। कई ओओपी भाषाएं (जावा, उद्देश्य-सी, सी #) एकाधिक विरासत की अनुमति नहीं देती हैं। – Nosredna

+2

PHP डिज़ाइन द्वारा एकाधिक विरासत की अनुमति नहीं देता है। पाइथन शायद इस अभ्यास का भी पालन करता है। अधिकांश आधुनिक ओओपी भाषाओं में यह आम है, क्योंकि कई विरासत कई सिरदर्द पैदा कर सकती हैं क्योंकि अधिकांश लोग इसका उपयोग ठीक से नहीं करते हैं। –

उत्तर

21

मैं कहूंगा कि पायथन का ओओपी समर्थन इस तथ्य के मुताबिक बहुत बेहतर है कि इसे पीएचपी के विरोध में भाषा में पेश किया गया था, जिसने ओओपी को मौजूदा प्रक्रियात्मक मॉडल पर बोल्ट किया था।

+0

दिलचस्प। मैंने सोचा कि कक्षाओं को पायथन के विकास में अपेक्षाकृत देर से जोड़ा गया था, लेकिन गिडो के ब्लॉग के एक पठन का कहना है कि इसे पहली सार्वजनिक रिलीज से पहले जोड़ा गया था। –

+0

जेसन: हालांकि उन्हें संशोधित किया गया है। पाइथन के लिए – troelskn

+0

1+। PHP में ओओपी एक गड़बड़ है। मैं पाइथन को अन्य डेवलपर्स (यानी, मेरे लिए कम काम) को बढ़ावा देने की कोशिश नहीं कर रहा हूं, लेकिन मैंने PHP के साथ शुरुआत की और पाइथन में कोडिंग के बाद मैं 5x से कम की वास्तविक लागत (यानी, एक छोटी गतिशील) के लिए एक PHP प्रोजेक्ट नहीं लेगा 50k के लिए CodeIgniter में वेबसाइट, कोई असाधारण नहीं)। हालांकि कोई भी इतना भुगतान नहीं करेगा, इसलिए मुझे लगता है कि आपको तस्वीर मिलती है। – orokusaki

3

मुझे लगता है कि वे इस बिंदु पर तुलनीय हैं। एक साधारण परीक्षण के रूप में, मुझे संदेह है कि Design Patterns या Patterns of Enterprise Application Architecture में कोई पैटर्न है, तर्कसंगत रूप से ओओपी में दो सबसे प्रभावशाली किताबें, जो किसी भी भाषा में लागू करना असंभव है।

दोनों भाषाओं में उनकी अल्पसंख्यकों के बाद से उछाल और सीमाएं आ गई हैं।

जहां तक ​​एकाधिक विरासत है, यह अक्सर creates more problems than it solves है, और इन दिनों, आमतौर पर जानबूझकर डिजाइन निर्णय के रूप में भाषाओं से बाहर छोड़ा जाता है।

+9

आप सी में किसी भी डिजाइन पैटर्न को भी लागू कर सकते हैं। सी सी ऑब्जेक्ट-उन्मुख के रूप में अजगर? –

+0

उम। विकिपीडिया लेख का लिंक एमआई के मुद्दों का वर्णन करता है, और विभिन्न भाषाओं में उनका सामना कैसे किया जाता है। लेख में पायथन का समाधान (एमआरओ) भी वर्णित है। मुझे यकीन नहीं है कि आप लेख से लिंक करके क्या हासिल करते हैं। – tzot

8

पायथन का ओओपी समर्थन बहुत मजबूत है; यह एकाधिक विरासत की अनुमति देता है, और सब कुछ प्रथम श्रेणी की वस्तु (कक्षाओं, विधियों, आदि सहित) के रूप में मनोरंजक है।

पॉलीमोर्फिज्म बतख टाइपिंग के माध्यम से व्यक्त किया जाता है। उदाहरण के लिए, आप एक सूची, एक tuple, एक शब्दकोश, एक फ़ाइल, एक वेब संसाधन, और सब कुछ एक ही तरीके से फिर से शुरू कर सकते हैं।

ऐसी बहुत सी छोटी पैडेंटिक चीजें हैं जो ओओ नहीं हैं, जैसे सूची.लेन() के बजाय लेन (सूची) के साथ अनुक्रम की लंबाई प्राप्त करने की तरह, लेकिन उनके बारे में चिंता न करना सबसे अच्छा है।

+6

"बहस से ओओ नहीं" का मतलब है "सामान्य ओओ वाक्यविन्यास नहीं?" यह स्पष्ट रूप से ओओ है, क्योंकि यह ऑब्जेक्ट की __len__ विधि है। –

+3

@ एस। लॉट - मुझे संदेह है कि उसका मतलब यही है। कार्यान्वयन ठीक से ओओ है, लेकिन वाक्यविन्यास नहीं है। अनुक्रम लंबाई अनुक्रम वस्तु का एक पहलू है; आदर्श रूप में, भाषा वाक्यविन्यास इसे इस तरह व्यक्त करेगा। –

+3

@ बेन: कार्यान्वयन वाक्यविन्यास से अधिक महत्वपूर्ण नहीं है? या आप ऑपरेटर को "उचित ओओपी नहीं" ओवरलोडिंग पर विचार करते हैं, क्योंकि वाक्यविन्यास गलत है? क्या आप 1.minus() से -1 पसंद करेंगे क्योंकि यह अधिक ओओ है? मैं वास्तव में यह देखने में असफल रहा कि लोग लेन मुद्दे के बारे में शिकायत कैसे कर सकते हैं। – nikow

3

इसके अलावा: पाइथन के मूल ऑपरेटर ओवरलोडिंग है, PHP के विपरीत (हालांकि यह एक एक्सटेंशन मौजूद है)। इसे प्यार करो या नफरत है, यह वहाँ है।

1

यदि आप "अधिक शुद्ध" ओओपी की तलाश में हैं, तो आपको स्मॉलटाक और/या रूबी को देखना चाहिए।

PHP ओओपी के लिए इसके समर्थन के साथ काफी बढ़ गया है, लेकिन जिस तरह से यह काम करता है (हर बार फिर से लोड करता है), ओओपी सर्वोत्तम प्रथाओं का पालन करने पर चीजें वास्तव में धीमी हो सकती हैं। रेलवे पर PHP के बारे में आप जो कुछ नहीं सुनते हैं, उनमें से एक कारण है।

+0

और यह भी क्योंकि PHP की मेटाप्रोग्रामिंग क्षमता रूबी या स्मॉलटाक, या यहां तक ​​कि पायथन से मेल नहीं खा सकती है। –

7

पाइथन के ओओपी मॉडल का एक पहलू असामान्य है जो इसकी encapsulation तंत्र है। असल में, पायथन मानते हैं कि प्रोग्रामर बुरी चीजें नहीं करते हैं, और इसलिए यह निजी सदस्य चर या विधियों की रक्षा के लिए किसी भी हद तक अपने रास्ते से बाहर नहीं जाता है।

यह उन सदस्यों के नामों के नाम से काम करता है जो दो अंडरस्कोर से शुरू होते हैं और दो से कम के साथ समाप्त होते हैं। इस तरह के पहचानकर्ता हर जगह बदल जाते हैं ताकि उनके पास कक्षा का नाम प्रीपेड किया जा सके, इससे पहले एक अतिरिक्त अंडरस्कोर।इस प्रकार:

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

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

नाम शुरुआत और दो (या अधिक) अंडरस्कोर के साथ समाप्त तो __init__ विधि अजगर नई उदाहरणों के निर्माण के लिए उपयोग करता है, घायल नहीं हैं, अकेला छोड़ दिया जाता है।

यहां link अधिक विस्तार से समझा रहा है।

+0

अन्य तरीकों के आसपास - दो अंडरस्कोर (और 2 अंडरस्कोर से कम अंत) के साथ शुरू होने वाले नाम उलझन में हैं, लेकिन अन्य नाम नहीं हैं। – mipadi

+0

@TokenMacGuy: कृपया इसे "थोड़ा गलत" कहने के बजाय अपने उत्तर को ठीक करें। –

+1

गुणों का उपयोग इस बात को नियंत्रित करने के लिए किया जा सकता है कि गुणों का उपयोग कैसे किया जाता है। लेकिन कभी-कभी मैं सच्चे निजी विशेषताओं को देखना चाहता हूं। –

संबंधित मुद्दे