तो मैं Python's Super Considered Harmful का पालन कर रहा था, और अपने उदाहरणों का परीक्षण करने गया।सुपर (तर्क गुजरने) का उपयोग करने का सही तरीका
हालांकि, Example 1-3, जो super
बुला जब __init__
तरीकों कि विभिन्न तर्क उम्मीद से निपटने का सही रास्ता दिखाने के लिए माना जाता है, खुले दिल से काम नहीं करता।
~ $ python example1-3.py
MRO: ['E', 'C', 'A', 'D', 'B', 'object']
E arg= 10
C arg= 10
A
D arg= 10
B
Traceback (most recent call last):
File "Download/example1-3.py", line 27, in <module>
E(arg=10)
File "Download/example1-3.py", line 24, in __init__
super(E, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 14, in __init__
super(C, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 4, in __init__
super(A, self).__init__(*args, **kwargs)
File "Download/example1-3.py", line 19, in __init__
super(D, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 9, in __init__
super(B, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
ऐसा लगता है कि object
ही दस्तावेज है, जो है कि तरीकों जो super
का उपयोग *args
और **kwargs
को स्वीकार करना चाहिए में उल्लेख सर्वोत्तम प्रथाओं में से एक का उल्लंघन करती है:
यह मैं क्या मिलता है।
अब, स्पष्ट रूप से श्री नाइट ने अपने उदाहरणों को काम करने की उम्मीद की, तो क्या यह कुछ ऐसा है जो पाइथन के हाल के संस्करणों में बदला गया था? मैंने 2.6 और 2.7 की जांच की, और यह दोनों पर विफल रहता है।
तो इस समस्या से निपटने का सही तरीका क्या है?
मेरा पसंदीदा तरीका है: फ्लैट और सरल विरासत पदानुक्रम। – millimoose
आपको एक संतुलित दृश्य प्राप्त करने के लिए ["पायथन के सुपर() को सुपर"] (http://rhettinger.wordpress.com/2011/05/26/super-cononsidered-super/) भी पढ़ना चाहिए :) –
@ BjörnPollex: धन्यवाद! आपका लिंक प्रश्न का उत्तर प्रदान करता है: आप "ऑब्जेक्ट 'से प्राप्त" रूट क्लास "लिख सकते हैं, और यह सुनिश्चित करता है कि' ऑब्जेक्ट 'के' __init__' को सही तरीके से कॉल किया जाए। – cha0site