कोई देख सकता है कि पाइथन यहां क्या कर रहा है, लेकिन ओवरराइडिंग का तरीका थोड़ा चरम है। इस मामले को लें जब कक्षा ए 100 विशेषताओं को परिभाषित करता है और कक्षा बी इन्हें प्राप्त करता है और 1 और विशेषता जोड़ता है। हम एक के लिए बी कॉल __init __() के लिए __init __() और बी के कोड केवल अपने एकल विशेषता परिभाषित जाने के लिए सक्षम होना चाहते हैं। इसी तरह, अगर हम एक में एक रीसेट() विधि शून्य करने के लिए सभी विशेषताओं सेट करने के लिए परिभाषित करते हैं, तो B के लिए इसी रीसेट() विधि एक के लिए विधि रीसेट() कॉल करने के लिए बस में सक्षम है और इसके बजाय एकल बी विशेषता को शून्य होना चाहिए तो ए के सभी कोड डुप्लिकेट करने के लिए। पाइथन मुश्किल बना रहा है जिसे वस्तु-उन्मुख प्रोग्रामिंग का एक बड़ा फायदा माना जाता है; वह है, कोड का पुन: उपयोग। यहां सबसे अच्छा विकल्प उन विधियों को ओवरराइड करने से बचाना है जिन्हें हम वास्तव में पुन: उपयोग करना चाहते हैं।
class X(object):
def __init__ (self):
print "X"
self.x = 'x'
self.reset()
print "back to X"
def reset (self):
print "reset X"
self.xx = 'xx'
class Y(X):
def __init__ (self):
print "Y"
super(Y,self).__init__()
self.y = 'y'
self.reset()
print "back to Y"
def reset (self):
print "reset Y"
super(Y,self).reset()
print "back to reset Y"
self.yy = 'yy'
aY = Y()
(यह काम ठीक से करने के लिए, self.reset() वर्ग वाई के लिए __init __ में कॉल() निकालने के लिए)
: तुम यहाँ अजगर के साथ जटिलताओं की समझ प्राप्त करना चाहते हैं, इस कोड की कोशिश
स्रोत
2013-04-12 19:49:26
आप मूल रूप से अजगर के लिए पूछ रहे हैं दूर dynamicness और आभासी तरीकों और फेंक * किसी भी तरह * यह पता लगाने विशेषता देखने श्रृंखला के भागों जहां एक समारोह lexically परिभाषित किया गया है के आधार पर छोड़ने के लिए। ऐसा नहीं होगा। – delnan