मैं एक Django ऐप बना रहा हूं जो इसके मॉडल में कुछ विरासत का उपयोग करता है, मुख्य रूप से क्योंकि मुझे सबकुछ यूयूआईडी और संदर्भ निर्दिष्ट करने की आवश्यकता है, इसलिए मुझे पता है कि यह कौन सा वर्ग था।पायथन और डीजेगो में विरासत और कारखाने के कार्यों
class BaseElement(models.Model):
uuid = models.CharField(max_length=64, editable=False, blank=True, default=lambda:unicode(uuid4()))
objmodule = models.CharField(max_length=255, editable=False, blank=False)
objclass = models.CharField(max_length=255, editable=False, blank=False)
class ChildElement(BaseElement):
somefield = models.CharField(max_length=255)
मुझे यकीन है कि objmodule, objclass, और UUID स्वचालित रूप से स्थापित कर रहे हैं करना चाहते हैं: यहाँ आधार वर्ग का एक सरलीकृत संस्करण है। मैंने this post से सीखा है कि यह मेरा खुद का कन्स्ट्रक्टर लिखकर ऐसा करना एक बुरा विचार है, और मैं एक फैक्ट्री फ़ंक्शन लिखने से बेहतर हूं। तो अब मेरा बेस एलिमेंट और चाइल्ड एलिमेंट इस तरह दिखता है:
class BaseElement(models.Model):
uuid = models.CharField(max_length=64, editable=False, blank=True, default=lambda:unicode(uuid4()))
objmodule = models.CharField(max_length=255, editable=False, blank=False)
objclass = models.CharField(max_length=255, editable=False, blank=False)
def set_defaults(self):
self.objmodule = unicode(self.__class__.__module__)
self.objclass = unicode(self.__class__.__name__)
self.uuid = unicode(uuid4())
class ChildElement(BaseElement):
somefield = models.CharField(max_length=255)
@staticmethod
def create(*args, **kwargs):
ce = ChildElement(*args, **kwargs)
ce.set_defaults()
return ce
यह काम करता है। मैं ChildElement.create(somefield="foo")
पर कॉल कर सकता हूं और मुझे uuid
, objmodule
, और objclass
फ़ील्ड सही सेट के साथ एक उचित वस्तु मिल जाएगी। हालांकि, जैसा कि मैं ChildElement2
और ChildElement3
जैसे अधिक कक्षाएं बना रहा हूं, मुझे लगता है कि मैं सटीक वही स्थिर फैक्ट्री फ़ंक्शन डाल रहा हूं। यह मुझ पर गले लगाता है क्योंकि कोड डुप्लिकेशन खराब है।
सामान्य तरीकों के साथ मैं सिर्फ BaseElement
में create
कारखाने समारोह सम्मिलित था, हालांकि, मुझे लगता है कि यहाँ ऐसा नहीं कर सकते, क्योंकि मैं (क्योंकि यह अभी तक नहीं बनाया गया है) आत्म करने के लिए एक संभाल की जरूरत नहीं है पाने के लिए उस वस्तु के वर्ग के बारे में जानकारी जिसने विधि को बुलाया था।
वहाँ एक रास्ता है कि मैं BaseElement
वर्ग में इस कारखाने की ओर पलायन कर सकते हैं तो मैं हर जगह इस कोड को नकल करने की जरूरत नहीं है और अभी भी यह किया है तो यह स्वचालित रूप से की uuid
, objmodule
, और objclass
मान सेट है?
यह वही है जो मैं ढूंढ रहा था। मुझे '@ classmethod' के बारे में याद दिलाने के लिए धन्यवाद। यह ऐसा कुछ नहीं है जिसका मैं अक्सर उपयोग करता हूं। – Pridkett
पायथन में '@ staticmethod' के लिए शायद ही कभी एक अच्छा उपयोग मामला है - यही वह है जिसे आप शायद कम से कम उपयोग करते हैं, यदि कभी भी। अक्सर अगर कुछ '@ classmethod' नहीं है तो यह मॉड्यूल में एक सरल शीर्ष-स्तरीय फ़ंक्शन के रूप में अधिक उपयुक्त है। –