लगता है कि पायथन जॉइन करने के लिए वस्तुओं पर ध्यान केंद्रित नहीं करता है, लेकिन प्रतीक पर, रूबी या स्मॉलटॉक की तुलना में, एक डिज़ाइन कारण के लिए?


9

मुझे लगा कि OOP की आधारशिला में से एक यह है कि, हमारे पास वस्तुएं हैं, जो आइटम हैं जिनसे हम निपटने में रुचि रखते हैं, और फिर हम उन्हें संदेश भेजते हैं।

तो यह स्वाभाविक लग सकता है कि, मेरे पास वस्तुओं का एक संग्रह है, और मुझे उन्हें एक स्ट्रिंग में रखने की आवश्यकता है, इसलिए ऐसा करने के लिए:

  ["x", "o", "o"].join(" | ")    # joining a tic-tac-toe row in Ruby

(स्मालटाक इसे वैसे ही करता है)। " | "में किसी तरह एक तर्क, एक कि यह कैसे शामिल होने के लिए की निशानी के रूप में के बारे में सोचा है। यह " "बहुत कम हो सकता है, अगर गेम बोर्ड सरल होना है। इसलिए जुड़ने वाला तत्व " | "विशेष रूप से कुछ ऐसा नहीं है जिसमें हमारी रुचि है - यह कार्यक्रम में मुख्य वस्तुएं नहीं हैं जिनका विशेष महत्व या महत्व है।

यदि पायथन इसका उपयोग करता है

  " | ".join(["x", "o", "o"])

यह कुछ अजीब लगता है कि यह लगभग महसूस करता है कि हम तर्क के लिए एक संदेश पारित कर रहे हैं, कुछ के बारे में तर्क बताने के लिए। शायद पायथन अधिक प्रक्रियात्मक है? हमारे लिए कुछ ड्यूटी करने के लिए ज्वाइनिंग स्ट्रिंग बताने के लिए?

क्या यह कार्यान्वयन को बचाने के लिए है, ताकि हमारे पास joinप्रत्येक संग्रह वर्ग के लिए परिभाषित न हो? लेकिन क्या यह सच नहीं है कि हम किसी भी संग्रह वर्ग के लिए एक बार लिख सकते हैं, जैसे कि रूबी में:

module Enumerable
  def my_join(joiner)
    self.inject {|a,b| a.to_s + joiner + b.to_s}
  end
end

(कुछ इस तरह से, to_sप्रत्येक आइटम पर कॉल करना, to_sप्रत्येक वर्ग पर भरोसा करना अपनी खुद की उचित बात करने के लिए, एक स्ट्रिंग में बदलने के लिए, और फिर उन्हें संक्षिप्त करना)। तो फिर हम स्ट्रिंग, हैश, या सेट, या जो भी संग्रह वर्ग है के प्रत्येक के लिए लागू करने की जरूरत नहीं है।

या क्या पायथन ठीक से ओओपी मार्ग पर नहीं जाता है? इसका उपयोग करता है len("abc")और type([])इसके बजाय "abc".len()या [].type()पायथन 3 में भी ऐसा लगता है। क्या पायथन एक डिजाइन कारण के लिए इस तरह से करता है?


7
से अजगर के ज़ेन : "यह करने के लिए one-- और अच्छा होगा यदि केवल एक --obvious तरीका नहीं होना चाहिए हालांकि कि जिस तरह से पहले जब तक आप डच में स्पष्ट नहीं हो सकता है।।"
kdgregory

2
एक रूप में, संग्रह जानता है कि कैसे एक सीमांकक के साथ खुद को एक स्ट्रिंग में बदलना है, दूसरे में एक स्ट्रिंग जानता है कि एक सीमांकक के रूप में खुद का उपयोग करके एक संग्रह को कैसे बदलना है। वे दोनों वस्तु-उन्मुख हैं, लेकिन क्रिया के विषय और वस्तु को बदलते हैं।
kdgregory

Maybe Python is more procedural?पाइथन कुछ क्रियात्मक परिवर्धन के साथ एक प्रक्रियात्मक भाषा थी ("पायथन ने लैम्ब्डा, कम (), फिल्टर () और मैप (), एक लिस्प हैकर के सौजन्य से जो उन्हें याद किया और वर्किंग पैच प्रस्तुत किया") तब तक जब तक वह संस्करण में प्रकट नहीं होता है 2. यह पहली बार काम करने के बाद लगभग डेढ़ दशक बाद था।

1
और आज भी पायथन भी एक ओओपी भाषा बनने की कोशिश नहीं कर रहा है, यह पूरी तरह से बहु-प्रतिमान है।

सी ++ की तरह, पायथन एक ऐसी भाषा है जो ओओपी की अनुमति देती है। यह जावा या स्मॉलटाक जैसी ओओपी भाषा के समान नहीं है।
रोबोट

जवाबों:


9

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

Armin Ronacher यह मुझसे बेहतर कहता है:

http://lucumr.pocoo.org/2011/7/9/python-and-pola/#seemingly-inverse-logic

"कल्पना करें कि पायथन इस तरह से काम नहीं करेगा। आपको पुनरावृत्ति को एक वास्तविक सूची में बदलना होगा, पहले इसे एक स्ट्रिंग में बदलना होगा। रूबी लोग अब यह तर्क देंगे कि रूबी मॉड्यूल में मिश्रण के साथ इस समस्या को हल करती है, और वे निश्चित रूप से सही हैं।" एक विकल्प है। लेकिन यह भाषा में एक घनिष्ठ डिजाइन निर्णय है, जिसके कई निहितार्थ हैं। पायथन इन प्रोटोकॉलों को लागू करके ढीली युग्मन को प्रोत्साहित करता है जहां वास्तविक कार्यान्वयन कहीं और हो सकते हैं। एक वस्तु चलने योग्य है, सिस्टम में एक और हिस्सा है कि इसे कैसे बनाया जाए। एक स्ट्रिंग में। "


1
ओपी ने इसे module Enumerateखंड के साथ संबोधित करने की कोशिश की लेकिन पायथन उस तरह से काम नहीं करता है, सभी पुनरावृत्तियों के लिए एक भी सुपरक्लास नहीं है जहां आप इस पद्धति को रख सकते हैं।

मैंने रूबी 2.0 में भी कोशिश की ... Hashऔर Stringवास्तव में सुपरक्लास के रूप में एक संग्रह वर्ग नहीं है ... उनके सुपरक्लास बस हैं Object। तो ये दो वर्ग सिर्फ
एन्यूमरेबल मिक्सिन

तो यह इस तथ्य की बहुत अधिक सीमा है कि "चलने योग्य" वास्तविक कोड के साथ एक वर्ग या कुछ नहीं है, बल्कि एक बतख टाइपिंग पैटर्न है? वैकल्पिक रूप से, यह केवल इसलिए है क्योंकि पायथन इतना सामान्य होना चाहता था कि किसी भी संग्रह पर एक ही कार्यान्वयन के साथ काम करने में सक्षम हो (जबकि कई अन्य मानक पुस्तकालय सिर्फ प्रत्येक संग्रह के लिए इसे लागू करेंगे यदि यह वास्तव में उस संग्रह पर लागू होता है)।
कैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.