यदि आपका हस्ताक्षर डिफ़ॉल्ट तर्कों का उपयोग तर्कों की संख्या में केवल अलग यह करने के लिए सही तरीका है। यदि आप तर्क के विभिन्न प्रकार में पास करने में सक्षम होना चाहते हैं तो मैं कीवर्ड तर्कों का उपयोग करने के बजाय isinstance
-आधारित उत्तर से किसी अन्य उत्तर में वर्णित दृष्टिकोण से बचने की कोशिश करूंगा। यदि केवल कीवर्ड तर्कों का उपयोग करना अनावश्यक हो जाता है तो आप इसे classmethods के साथ जोड़ सकते हैं (bzrlib कोड इस दृष्टिकोण को पसंद करता है)। यह सिर्फ एक मूर्ख उदाहरण है, लेकिन मुझे आशा है कि आप विचार प्राप्त:
class C(object):
def __init__(self, fd):
# Assume fd is a file-like object.
self.fd = fd
@classmethod
def fromfilename(cls, name):
return cls(open(name, 'rb'))
# Now you can do:
c = C(fd)
# or:
c = C.fromfilename('a filename')
सूचना उन सभी classmethods अब भी वही __init__
के माध्यम से जाना है, लेकिन classmethods का उपयोग कर याद करने के लिए अधिक से अधिक सुविधाजनक हो सकता है कि कौन से कीवर्ड तर्क के संयोजन __init__
काम करने के लिए।
isinstance
जिससे बचना है, क्योंकि अजगर का बतख टाइपिंग यह मुश्किल यह पता लगाने की क्या वस्तु की तरह वास्तव में में पारित किया गया था बनाता है उदाहरण के लिए:। यदि आप या तो एक फ़ाइल नाम या एक फ़ाइल जैसी वस्तु आप isinstance(arg, file)
उपयोग नहीं कर सकते क्योंकि ले जाना चाहते हैं कई फाइल-जैसी ऑब्जेक्ट्स हैं जो file
(जैसे urllib से लौटाए गए, या स्ट्रिंगियो, या ...) को उपclass नहीं करते हैं। यह आमतौर पर एक बेहतर विचार है कि कॉलर आपको अलग-अलग कीवर्ड तर्कों का उपयोग करके स्पष्ट रूप से बताए कि किस तरह का ऑब्जेक्ट था।
मुझे इस सवाल के बारे में सोच है - http://stackoverflow.com/questions/682504/what-is-a-clean-pythonic-way-to-have-multiple -कॉन्स्ट्रक्टर्स-इन-पायथन – Gant
सर्वश्रेष्ठ: [तर्क प्रकार के आधार पर '__init__' विधि को अधिभार कैसे करें?] (https://stackoverflow.com/questions/141545/how-to-overload-init-method-based-on- तर्क-प्रकार) –