2012-07-17 16 views
26

मैं टेलनेट के माध्यम से एक प्रयोगशाला उपकरण से कनेक्ट करने की कोशिश कर रहा हूं।पायथन - पुरानी शैली के वर्गों से विरासत

import telnetlib 
class Instrument(telnetlib.Telnet): 
    def __init__(self, host=None, port=0, timeout=5): 
     super(Instrument,self).__init__(host, port, timeout) 

सभी मैं इस कोड में करने के लिए कोशिश कर रहा हूँ माता पिता से __init__ विधि के वारिस है: मैं मानक पुस्तकालय में telnetlib मॉड्यूल से Telnet वर्ग का विस्तार करने, हमारे साधन करने के लिए विशेष कार्य शामिल करना चाहते हैं कक्षा (telnetlib.Telnet) और मानक तर्कों को पारित करें, इसलिए मैं बाद में __init__ पर चीज़ें जोड़ सकता हूं। इस सूत्र ने अन्य अवसरों पर मेरे लिए काम किया है; इस बार यह मुझे super() बयान पर एक त्रुटि देता है जब मैं का दृष्टांत का प्रयास करें:

TypeError: must be type, not classobj 

मैं telnetlib के लिए स्रोत कोड को देखा, और टेलनेट एक पुरानी शैली वर्ग प्रतीत होता है (यह से विरासत नहीं है object) - मुझे आश्चर्य है कि यह मेरी समस्या का स्रोत हो सकता है? यदि हां, तो इसे कैसे दूर किया जा सकता है? मैंने कुछ कोड उदाहरण देखे हैं जहां व्युत्पन्न वर्ग सुपरक्लास और object दोनों से विरासत में मिलता है, हालांकि मुझे पूरी तरह से यकीन नहीं है कि यह मेरे जैसा ही समस्या है।

पूर्ण प्रकटीकरण: मैं भी super() के स्थान पर telnetlib.Telnet का उपयोग कर from telnetlib import TelnetTelnet साथ super() के स्थान पर की कोशिश की है, और। इन मामलों में समस्या बनी हुई है।

धन्यवाद!

उत्तर

36

आप constructor इस तरह कॉल करने की आवश्यकता:

telnetlib.Telnet.__init__(self, host, port, timeout) 

आप को जोड़ने के लिए स्पष्ट selftelnet.Telnet.__init__ के बाद से एक बाध्य विधि बल्कि एक अनबाउंड विधि है, यानी एक उदाहरण सौंपा witout नहीं है की जरूरत है। तो इसे कॉल करते समय आपको घटना को स्पष्ट रूप से पारित करने की आवश्यकता है।

>>> Test.__init__ 
<unbound method Test.__init__> 
>>> Test().__init__ 
<bound method Test.__init__ of <__main__.Test instance at 0x7fb54c984e18>> 
>>> Test.__init__() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method __init__() must be called with Test instance as first argument (got nothing instead) 
+0

मैंने कोशिश की है - यह मुझे त्रुटि देता है: 'TypeError: अनबाउंड विधि __init __() को टेलनेट इंस्टेंस के साथ पहली तर्क के रूप में बुलाया जाना चाहिए (इसके बजाय str instance मिला) ' –

+0

कृपया सही कोड और त्रुटि जो आपको मिलती है कोड जो मैंने अभी पोस्ट किया है। क्योंकि वास्तव में यह किया जाता है कि यदि आप पुराने शैली के क्लास के अभिभावक कन्स्ट्रक्टर को कॉल करना चाहते हैं तो यह कैसे किया जाता है। – ThiefMaster

+0

आह, मैंने आपके कोड और खान के बीच अंतर देखा है - आपके पास '__init__' के पहले तर्क के रूप में 'स्वयं' था। यह अब काम करता है - इतनी जल्दी जवाब देने के लिए धन्यवाद! क्या आप मुझे समझा सकेंगे कि आपको कन्स्ट्रक्टर को पहला तर्क क्यों 'आत्म' देने की आवश्यकता है? मैं पाइथन के लिए नया हूँ। –

13

आप object से प्राप्त करना है, और आप पुरानी शैली वर्ग आप के वारिस की कोशिश कर रहे करने के बाद इसे रखा जाना चाहिए से (ताकि object के तरीकों पहले नहीं पाए जाते हैं):

>>> class Instrument(telnetlib.Telnet,object): 
...  def __init__(self, host=None, port=0, timeout=5): 
...   super(Instrument,self).__init__(host, port, timeout) 
... 
>>> Instrument() 
<__main__.Instrument object at 0x0000000001FECA90> 

ऑब्जेक्ट से विरासत आपको एक नई शैली की कक्षा देता है जो super के साथ काम करता है।

+2

क्या यह पुरानी शैली के वर्ग से इस तरह के लिए एक नई शैली की कक्षा बनाता है जो इस तरह के आधार पर सुरक्षित है? – ThiefMaster

+0

@ थिफमास्टर मुझे किसी भी मुद्दे से अवगत नहीं है, लेकिन मैंने कभी इसे क्रोध में नहीं किया है, इसलिए मुझे वास्तव में कोई जानकारी नहीं है। क्या आप किसी भी समस्या का अनुमान लगाते हैं? – Marcin

+0

मैं पाइथन में बहु-विरासत से अपरिचित हूं। चूंकि एक नई शैली की कक्षा मेरे उद्देश्य के लिए कोई लाभ नहीं देती है, इसलिए मैं उपरोक्त TheifMaster की रणनीति के साथ रहना चाहता हूं। वैसे भी धन्यवाद! –

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