2014-04-16 8 views
21

मैं निम्नलिखित पायथन 2.7 कोड है:अजगर सुपर __init__ विरासत

class Frame: 
    def __init__(self, image): 
     self.image = image 

class Eye(Frame): 
    def __init__(self, image): 
     super(Eye, self).__init__() 
     self.some_other_defined_stuff() 

मैं __init__() विधि का विस्तार करने के लिए इतना है कि जब मैं एक 'आँख' का दृष्टांत यह अन्य सामान (स्वयं का एक समूह करता है कोशिश कर रहा हूँ। कुछ_other_defined_stuff()), फ़्रेम सेट अप के अतिरिक्त। Frame.__init__() पहले चलाने की जरूरत है।

super(Eye, self).__init__() 
TypeError: must be type, not classobj 

कौन सा मैं के तार्किक कारण समझ में नहीं आता:

मैं निम्नलिखित त्रुटि मिलती है। क्या कोई कृपया समझा सकता है? मैं बस रूबी में 'सुपर' टाइप करने के लिए प्रयोग किया जाता है।

+3

'फ़्रेम' को 'ऑब्जेक्ट' का विस्तार करना होगा। 'सुपर' केवल नए शैली के वर्गों पर काम करेगा। – That1Guy

उत्तर

40

यहाँ दो त्रुटियों के होते हैं:

  1. super() केवल new-style classes के लिए काम करता है; object का उपयोग Frame के लिए बेस क्लास के रूप में करें ताकि इसे नई शैली के अर्थशास्त्र का उपयोग किया जा सके।

  2. आपको अभी भी सही तर्क के साथ ओवरराइड विधि को कॉल करने की आवश्यकता है; image में __init__ पर कॉल करें।

तो सही कोड होगा:

class Frame(object): 
    def __init__(self, image): 
     self.image = image 

class Eye(Frame): 
    def __init__(self, image): 
     super(Eye, self).__init__(image) 
     self.some_other_defined_stuff() 
+0

क्या पायथन> 3.X में 'ऑब्जेक्ट' का संदर्भ अनावश्यक होगा? – gented

+0

@gented: हाँ, बेस क्लास के रूप में 'ऑब्जेक्ट' को पायथन 3 में शामिल किया गया है (क्योंकि अब कोई पुरानी शैली की कक्षाएं नहीं हैं)। –

11

Frameobject का विस्तार करना होगा, क्योंकि केवल नई शैली वर्गों का समर्थन super फोन तुम इतनी तरह Eye में बनाना:

class Frame(object): 
    def __init__(self, image): 
     self.image = image 

class Eye(Frame): 
    def __init__(self, image): 
     super(Eye, self).__init__(image) 
     self.some_other_defined_stuff() 
+0

एचआरएम, यह नीचे की ओर कठोर लगता है; सिर्फ इसलिए कि लेखक ने 'छवि' तर्क को पारित नहीं किया है? –

+2

@MartijnPieters गंभीरता से हुह? वैसे भी तय – myusuf3

0

हाय देखना पायथन के लिए मेरे कामकाजी कोड 2.7

__metaclass__ = type 
class Person: 
    def __init__(self, first, last, age): 
     self.firstname = first 
     self.lastname = last 
     self.age = age 

    def __str__(self): 
     return self.firstname + " " + self.lastname + ", " + str(self.age) 

class Employee(Person): 
    def __init__(self, first, last, age, staffnum): 
     super(Employee, self).__init__(first, last, age) 
     self.staffnumber = staffnum 

    def __str__(self): 
     return super(Employee, self).__str__() + ", " + self.staffnumber 


x = Person("Marge", "Simpson", 36) 
y = Employee("Homer", "Simpson", 28, "1007") 

print(x) 
print(y) 
+1

इस उत्तर को बेहतर बनाने के लिए, कृपया अपनी प्रारूपण जांचें और अपने कोड के लिए स्पष्टीकरण प्रदान करें। –

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