मेरे पास मुख्य परियोजना में एक कक्षा है जिसे मैं बदलना नहीं चाहता हूं।जब यह बंदर-पैच होता है तो मूल विधि को कैसे कॉल करें?
class A():
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def name(self):
# this method could be much more complex
return self.lastname.upper()
मैं एक प्लगइन मेचांसिम बनाने की कोशिश कर रहा हूं।
if __name__ == '__main__':
''' The main project has an extension point that allows me to do'''
# for each class extension such as AExtended:
A.name = AExtended.name
''' After the extensions are loaded, some behaviours may be changed'''
a = A("John", "Doe")
print(a.name())
एक प्लगइन इस तरह लिखा जा सकता है:
class AExtended(A):
''' This is an extension I provide through a plugin mechanism
'''
def name(self):
return self.firstname + ' ' + self.lastname.upper()
यह सब बहुत अच्छी तरह से काम करता है अब तक तो अच्छा, मैं इस तरह एक विस्तार बिंदु है। अब मुझे "जॉन डीओई" मिलता है।
मेरी समस्या यह है कि मूल name()
विधि काफी जटिल हो सकती है। दूसरे शब्दों में, मैं AExtended
में self.lastname.upper()
पर कॉल करने का जोखिम नहीं उठा सकता। मैं "सुपर" विधि को कॉल करना चाहता हूं, जो अब अस्तित्व में नहीं है, क्योंकि इसे ओवरराइट किया गया है।
मैं कैसे कुछ इस तरह प्राप्त करने के लिए अपना कोड बदल सकते हैं क्रम में,:
class AExtended(A):
def name(self):
# I'm looking for a way to call the base implementation that was in A.name()
return self.firstname + ' ' + parent.name()
आपकी मदद के लिए धन्यवाद!
संपादित करें: मैं जो करने की कोशिश करता हूं उसके कुछ स्पष्टीकरण।
- मैं चाहता हूं कि प्लगइन
A
के व्यवहार को पैच करे। मैं की मौजूदा उपभोक्ताओं को बदलने के लिए खर्च नहीं उठा सकते एक A
जैसे कई कक्षाओं बदला जा सकता है कि मैं पूर्ण नियंत्रण और जिम्मेदारी- के लिए प्लग-इन करना चाहते हैं, यह
AExtended
A
से विरासत की जरूरत नहीं है सच है, लेकिन यहself.firstname
तक पहुंचने का एक आसान तरीका था। अगर यह मदद कर सकता है तो मुझे एक अलग डिजाइन पैटर्न के बाद कोई समस्या नहीं है।
मैं एक समाधान है, लेकिन यह सामान्य
class AExtended(A):
def name(self):
# I'm looking for a way to call the base implementation that was in A.name()
return self.firstname + ' ' + self.parentname()
#in main
A.parentname = A.name
A.name = AExtended.name
हाँ, मैंने पढ़ा है कि कैसे [फोन माता पिता वर्ग विधि] के लिए (http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from- बाल-वर्ग-इन-पायथन) लेकिन 'AExtended.name' में, 'self' ओवरराइडिंग – rds
की वजह से' ए' है 'मैं [निजी विधि ओवरराइडिंग] के साथ अधिक लकी हो सकता हूं (http://stackoverflow.com/ प्रश्न/2484215/कैसे-करें-i-override-a-parent-classs-functions-in-python) लेकिन मैं ए विधि नाम नहीं बदल सकता। – rds
अपनी स्पष्टीकरण को देखते हुए, मैं सुझाव दूंगा कि आप प्रश्न शीर्षक बदल दें। एक और सटीक शीर्षक हो सकता है "जब यह बंदर-पैच होता है तो मूल विधि को कैसे कॉल करें?" – Weeble