यह देखते हुए कि पायथन कई विरासतों के लिए अनुमति देता है, पायथन में मुहावरेदार विरासत क्या दिखती है?
जावा की तरह एकल वंशानुक्रम वाली भाषाओं में, वंशानुक्रम का उपयोग तब किया जाएगा जब आप कह सकते हैं कि एक वस्तु "किसी अन्य वस्तु का" है और आप वस्तुओं के बीच कोड साझा करना चाहते हैं (मूल वस्तु से बच्चे की वस्तु तक)। उदाहरण के लिए, आप कह सकते हैं कि Dogएक है Animal:
public class Animal {...}
public class Dog extends Animal {...}
लेकिन चूंकि पायथन एकाधिक वंशानुक्रम का समर्थन करता है इसलिए हम एक साथ कई अन्य वस्तुओं की रचना करके एक वस्तु बना सकते हैं। नीचे दिए गए उदाहरण पर विचार करें:
class UserService(object):
def validate_credentials(self, username, password):
# validate the user credentials are correct
pass
class LoggingService(object):
def log_error(self, error):
# log an error
pass
class User(UserService, LoggingService):
def __init__(self, username, password):
self.username = username
self.password = password
def authenticate(self):
if not super().validate_credentials(self.username, self.password):
super().log_error('Invalid credentials supplied')
return False
return True
क्या यह पायथन में कई वंशानुक्रम का स्वीकार्य या अच्छा उपयोग है? इसके बजाय कह की विरासत है जब एक वस्तु "है-एक" एक और वस्तु की, हम एक बनाने है Userमॉडल से बना UserServiceऔर LoggingService।
डेटाबेस या नेटवर्क संचालन के लिए सभी तर्क Userको UserServiceऑब्जेक्ट में रखकर मॉडल से अलग रखा जा सकता है और लॉग इन करने के लिए सभी तर्क रखे जा सकते हैं LoggingService।
मैं इस दृष्टिकोण के साथ कुछ समस्याएं देख रहा हूं:
- क्या यह एक ईश्वर वस्तु बनाता है? चूंकि
Userविरासत में मिली है, या इससे बना है,UserServiceऔरLoggingServiceक्या यह वास्तव में एकल जिम्मेदारी के सिद्धांत का पालन कर रहा है? - माता-पिता / अगली-इन-लाइन ऑब्जेक्ट पर विधियों तक पहुंचने के लिए (जैसे,
UserService.validate_credentialsहमेंsuperइसका उपयोग करना होगा । इससे यह देखना थोड़ा अधिक कठिन हो जाता है कि कौन सी वस्तु इस विधि को संभालने जा रही है और जैसा कि स्पष्ट नहीं है, कहते हैं , तुरंतUserServiceऔर कुछ करना पसंद हैself.user_service.validate_credentials
उपरोक्त कोड को लागू करने का पाइथोनिक तरीका क्या होगा?