के भीतर से एक नई वस्तु उत्पन्न करने के लिए Idiomatic Python मेरे पास मेरी एक ऑब्जेक्ट पर एक विधि है जो उसी कक्षा का एक नया उदाहरण देता है। मैं इस विधि को लिखने के लिए सबसे बेवकूफ तरीका जानने की कोशिश कर रहा हूं जैसे कि यह कोड को डुप्लिकेट किए बिना उसी प्रकार की एक नई वस्तु उत्पन्न करता है।कक्षा
के बाद से इस पद्धति का उदाहरण डेटा का उपयोग करता, मेरी पहली पास होना जरूरी है:
class Foo(object):
def get_new(self):
data = # Do interesting things
return Foo(data)
हालांकि, अगर मैं फू उपवर्ग और get_new ओवरराइड नहीं करते, SubFoo पर get_new बुला एक फू वापसी होगी! तो, मैं एक classmethod लिख सकते हैं:
class Foo(object):
@classmethod
def get_new(cls, obj):
data = # Munge about in objects internals
return cls(data)
हालांकि, डेटा मैं तक पहुँचने हूँ वस्तु के लिए विशिष्ट है, तो यह इस बात के लिए कैप्सूलीकरण को तोड़ने के लिए एक "सामान्य" (असज्जित) विधि होने के लिए नहीं लगता है। इसके अतिरिक्त, आपको इसे SubFoo.get_new(sub_foo_inst)
जैसा कॉल करना होगा, जो अनावश्यक लगता है। मैं ऑब्जेक्ट को बस "जानना" चाहता हूं कि किस प्रकार का रिटर्न - एक ही प्रकार जैसा ही है!
मुझे लगता है कि कक्षा में फैक्ट्री विधि जोड़ना भी संभव है, और तर्क को डुप्लिकेट किए बिना, हर जगह वापसी प्रकार को ओवरराइड करना संभव है, लेकिन ऐसा लगता है कि उप-वर्गों पर बहुत अधिक काम किया जाता है।
तो, मेरा सवाल यह है कि, एक विधि लिखने का सबसे अच्छा तरीका क्या है जो कक्षा के प्रकार में लचीलापन देता है बिना किसी जगह के प्रकार को एनोटेट किए बिना?
क्लासमेड स्वयं पाइथन पर बहुत मूर्ख नहीं हैं; कारखानों केवल सादे कार्य हो सकते हैं जो कक्षा के समान मॉड्यूल में रहते हैं। –
@Adam: कक्षा विधियों का उपयोग होता है (उदाहरण के लिए जब आप कक्षा चर का उपयोग कर रहे हैं और विरासत तोड़ना नहीं चाहते हैं)। स्थिर तरीके बहुत खराब हैं। – delnan