का उपयोग करके मैं किसी ऑब्जेक्ट को ओवरराइड करने के लिए किसी ऑब्जेक्ट को उप-वर्गीकृत कर रहा हूं जिसमें मैं कुछ कार्यक्षमता जोड़ना चाहता हूं। मैं इसे पूरी तरह से प्रतिस्थापित नहीं करना चाहता हूं या एक अलग नामित विधि जोड़ना चाहता हूं लेकिन विधि में वैकल्पिक तर्क जोड़कर सुपरक्लास विधि के अनुकूल हूं। क्या सुपरक्लास के सभी तर्कों को पार करने के लिए *args
और **kwargs
के साथ काम करना संभव है और फिर भी डिफ़ॉल्ट के साथ वैकल्पिक तर्क जोड़ना संभव है? मैं intuitively निम्नलिखित के साथ आया था, लेकिन यह काम नहीं करता है:एक ओवरराइड विधि में एक कीवर्ड तर्क जोड़कर और ** kwarg
class A(object):
def foo(self, arg1, arg2, argopt1="bar"):
print arg1, arg2, argopt1
class B(A):
def foo(self, *args, argopt2="foo", **kwargs):
print argopt2
A.foo(self, *args, **kwargs)
b = B()
b.foo("a", "b", argopt2="foo")
बेशक
मैं यह काम करने के लिए प्राप्त कर सकते हैं जब मैं स्पष्ट रूप से सुपर क्लास की विधि की सभी तर्कों जोड़ें:
class B(A):
def foo(self, arg1, arg2, argopt1="foo", argopt2="bar"):
print argopt2
A.foo(self, arg1, arg2, argopt1=argopt1)
ऐसा करने का सही तरीका क्या है, क्या मुझे सभी ओवरराइड विधियों के तर्कों को जानना और स्पष्ट रूप से अवश्य कहना है?
आप + डेल पाने के बजाए पॉप का उपयोग कर सकते हैं। – iny
मैं हमेशा dict.pop के बारे में भूल जाता हूँ! –
आपका तर्क 'keyError' के साथ विफल रहता है जब 'argopt2' पास नहीं होता है। 'Kwargs.pop ('argopt2', default_for_argopt2) का उपयोग करना इसे ठीक करने का सबसे आसान तरीका है। –