2011-01-15 13 views
47

उदाहरण के लिए — का कहना है कि मैं पाइथन के dict प्रकार के लिए helloWorld() विधि जोड़ना चाहता हूं। क्या मैं यह कर सकता हूं?क्या मैं अंतर्निहित पायथन प्रकारों में कस्टम विधियों/विशेषताओं को जोड़ सकता हूं?

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

यहाँ कैसे यह जावास्क्रिप्ट में नीचे जाना होगा है:

String.prototype.hello = function() { 
    alert("Hello, " + this + "!"); 
} 
"Jed".hello() //alerts "Hello, Jed!" 

यहाँ, और उदाहरण — http://www.javascriptkit.com/javatutors/proto3.shtml

+0

आप इसे कक्षा को फिर से खोलकर भी रूबी में कर सकते हैं, यानी: वर्ग स्ट्रिंग; def new_method() ...; अंत; मुझे यकीन है कि अजगर के पास ऐसा कुछ भी है। –

+0

@ अब्दुल्लाह मेरा मानना ​​है कि आप बंदर पैचिंग का जिक्र कर रहे हैं, जो अधिकतर फहरा हुआ है। –

+0

हाँ हाँ। यह रेल में खत्म हो गया है। –

उत्तर

53

आप मूल प्रकार को सीधे विधि नहीं जोड़ सकते हैं। हालांकि, आप इस प्रकार को उप-वर्गीकृत कर सकते हैं, फिर इसे अंतर्निहित/वैश्विक नामस्थान में प्रतिस्थापित कर सकते हैं, जो वांछित प्रभाव को प्राप्त करता है। दुर्भाग्य से, शाब्दिक वाक्यविन्यास द्वारा बनाई गई वस्तुएं वेनिला प्रकार के बने रहेंगी और आपके नए तरीके/विशेषताओं नहीं होंगे।

यहाँ यह क्या लग रहा है उपवर्गीकरण

तरह
# Built-in namespace 
import __builtin__ 

# Extended subclass 
class mystr(str): 
    def first_last(self): 
     if self: 
      return self[0] + self[-1] 
     else: 
      return '' 

# Substitute the original str with the subclass on the built-in namespace  
__builtin__.str = mystr 

print str(1234).first_last() 
print str(0).first_last() 
print str('').first_last() 
print '0'.first_last() 

output = """ 
14 
00 

Traceback (most recent call last): 
    File "strp.py", line 16, in <module> 
    print '0'.first_last() 
AttributeError: 'str' object has no attribute 'first_last' 
""" 
+0

मुझे लगता है कि मुझे बस सबक्लासिंग की पसंदीदा विधि का उपयोग करना होगा। शायद मैं इसे प्यार करने के लिए बढ़ जाऊंगा। – jedmao

+11

नोट: '__builtin__' मॉड्यूल का नाम बदलकर पायथन 3 में 'बिल्टिन' कर दिया गया था। – changokun

+0

खैर मुझे अजगर 2 में एक समस्या का सामना करना पड़ा। उसके बाद मैं अब और प्रकार की जांच नहीं कर सकता> प्रकार ('') == str <बस देता है> झूठा <। जब मैं टाइप करता हूं ("") मुझे मिलता है, लेकिन किसी भी तरह की तुलना अब और काम नहीं करती है। 'लाइन __builtin __। Str = mystr' प्रकार के काम के लिए चेक चलाने से पहले। – Nadu

1

हाँ साथ एक उपयोगी लिंक है उन प्रकार उपवर्गीकरण द्वारा। unifying types and classes in Python देखें।

नहीं, इसका मतलब यह नहीं है कि वास्तविक डिक्ट्स में इस प्रकार का होगा, क्योंकि यह भ्रमित होगा। एक बिल्टिन प्रकार को उपclass कार्यक्षमता जोड़ने के लिए पसंदीदा तरीका है।

+5

यह भ्रमित होगा, और बहुत उपयोगी होगा। –

+0

@EvgeniSergeev आपको क्यों लगता है कि यह बहुत उपयोगी होगा? मैंने उन लोगों को वास्तव में कभी नहीं समझा है जो इसकी इच्छा रखते हैं। क्या आपको लगता है कि 5 टाइप int int नहीं होना चाहिए, या आपको लगता है कि टाइप int को म्यूटेबल होना चाहिए (जबकि 5 स्वयं अपरिवर्तनीय है)? – Veky

+0

@ वेकी मैं 'any_dictionary_instance.len()' या '.size()', 'any_dictionary_instance .__ len __()' और 'len (any_dictionary_instance) 'के अलावा, जो इसे कॉल करता हूं, के अलावा। आकार अर्थात् कंटेनरों की एक संपत्ति है, इसलिए लिखने के लिए यह अधिक सुविधाजनक है जैसे आप कहते हैं उदा। "0 से ऑब्जेक्ट के आकार में पुनरावृत्त करें" ... ओह, इसे व्यक्त नहीं कर सकते हैं, भाषा मुझे इसे "ऑब्जेक्ट के आकार से 0 तक पुनरावृत्त" के रूप में पुन: उत्पन्न करने के लिए मजबूर करती है। ऐतिहासिक कारणों से बेहतर कुछ भी नहीं, मैं इकट्ठा करता हूं। –

-1

अजगर में जाने का रास्ता है। पॉलीग्लोट प्रोग्रामर सही स्थिति के लिए सही उपकरण का उपयोग करना सीखते हैं - कारण के भीतर। रेल के रूप में कलात्मक रूप से निर्मित कुछ (रूबी का उपयोग कर एक डीएसएल) पाइथन जैसे अधिक कठोर वाक्यविन्यास वाली भाषा में कार्यान्वित करना मुश्किल है। लोग अक्सर दोनों की तुलना करते हैं कि वे कितने समान हैं। तुलना कुछ हद तक अनुचित है। पाइथन अपने तरीके से चमकता है। totochto।