एक आधार वर्ग से एक व्युत्पन्न वर्ग के लिए जा रहे में str (आत्म। वर्ग) बचाने के लिए सुनिश्चित कर रहे हैं आम तौर पर एक संकेत है एक कार्यक्रम में खराब डिजाइन का। hasattr
का उपयोग करके आप जिस विधि का प्रस्ताव देते हैं, वह गंभीर समस्या हो सकती है। मैं तुम्हें दिखाता हूँ:
# defined in some open source library
class MyObject(object):
def what_is_derived(self):
if hasattr(self, 'derived1'):
return 'derived1'
elif hasattr(self, 'derived2'):
return 'derived2'
else:
return 'base'
के लिए बहाना है कि कक्षाओं Derived1
और Derived2
है कि एक ही पुस्तकालय में परिभाषित कर रहे हैं। अब, आप MyObject
की विशेषताओं का उपयोग करना चाहते हैं, ताकि आप इसे अपने कोड में प्राप्त कर सकें।
# defined in your own code
class MyBetterObject(MyObject):
pass
better_object = MyBetterObject()
better_object.what_is_derived() # prints 'base'
बहुरूपता का पूरा बिंदु यह है कि आप बेस क्लास को बदलने के बिना कई व्युत्पन्न कक्षाएं प्राप्त कर सकते हैं। आधार वर्ग को इसके सभी व्युत्पन्न वर्गों के बारे में जागरूक करके, आप इस तरह के वर्ग की उपयोगिता को गंभीर रूप से कम करते हैं। आप बेस क्लास को बदले बिना व्युत्पन्न कक्षा नहीं बना सकते हैं।
या तो आप एक व्युत्पन्न कक्षा के साथ काम करना चाहते हैं, या आपको कोई परवाह नहीं है कि विशिष्ट वर्ग क्या है और आपको केवल बेस क्लास के गुण/विधियां हैं। यह सभी ओओपी भाषाओं में समान है। व्युत्पन्न वर्ग क्या है, यह जानने के लिए सुविधाएं हैं, लेकिन आमतौर पर यह एक बुरा विचार है।
एक Django मॉडल दृष्टिकोण से, मैं आमतौर पर इस तरह से विरासत का उपयोग करें:
class Address(models.Model):
# fields...
class Person(Address):
# fields...
class Business(Address):
# fields...
Address.objects.all() # find all addresses for whatever reason
Person.objects.all() # im only interested in people
Business.objects.all() # need to work with businesses
# need to show all addresses in a postcode, and what type of address they are?
businesses = Business.objects.filter(postcode='90210')
people = Person.objects.filter(postcode='90210')
# use the address properties on both
Django मॉडल के साथ गहराई से नेस्टेड विरासत चेन अजीब हैं। ज्यादातर मामलों में वे भी बहुत अनावश्यक हैं। hasattr
चेक के साथ अपनी बेस क्लास को प्रदूषित करने के बजाय, एक सहायक विधि को परिभाषित करें जो आवश्यक व्युत्पन्न कक्षाओं से पूछताछ करने में सक्षम है यदि ऐसी चीज के लिए कहा जाता है। बस इसे बेस क्लास पर परिभाषित न करें।
नाह .. django-polymorphic पर बेहतर दिखें ;-) – vdboor