कहें कि मेरे पास कक्षा A
, B
और C
है।एमआरओ त्रुटियों के बिना मैं गतिशील रूप से बेस क्लास के रूप में मिश्रित कैसे जोड़ूं?
कक्षा A
और B
कक्षा C
के लिए दोनों मिश्रित कक्षाएं हैं।
class A(object):
pass
class B(object):
pass
class C(object, A, B):
pass
यह जब वर्ग सी instantiating मैं इसे काम करने के लिए वर्ग सी से object
को दूर करने के लिए होता है काम नहीं करेगा। (अन्यथा आपको एमआरओ समस्याएं मिलेंगी)।
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases B, object, A
हालांकि, मेरा मामला थोड़ा और जटिल है। मेरे मामले वर्ग C
में सर्वर है जहां A
और B
स्टार्टअप पर लोड होने वाले प्लगइन होंगे। ये अपने फ़ोल्डर में रह रहे हैं।
मेरे पास Cfactory
नामक कक्षा भी है। Cfactory में मैं एक __new__
विधि है कि, एक पूरी तरह कार्यात्मक वस्तु सी __new__
विधि में मैं प्लग-इन के लिए खोज पैदा करेगा __import__
का उपयोग कर उन्हें लोड, और फिर उन्हें C.__bases__ += (loadedClassTypeGoesHere,)
को असाइन तो निम्नलिखित एक संभावना है है: (यह काफी सार)
class A(object):
def __init__(self): pass
def printA(self): print "A"
class B(object):
def __init__(self): pass
def printB(self): print "B"
class C(object):
def __init__(self): pass
class Cfactory(object):
def __new__(cls):
C.__bases__ += (A,)
C.__bases__ += (B,)
return C()
यह फिर से काम नहीं करेगा, और एमआरओ त्रुटियों फिर से दे देंगे बनाया:
TypeError: Cannot create a consistent method resolution
order (MRO) for bases object, A
एक इसके लिए आसान फिक्स बेसक्लास को A
और B
से हटा रहा है। हालांकि यह उन्हें पुरानी शैली जिन वस्तुओं पर जब इन प्लग इन चलाने जा रहा है स्टैंड-अलोन से बचा जाना चाहिए (जो संभव हो जाना चाहिए, unittest वार)
एक और आसान ठीक C
से object
को हटा रहा है कर देगा, लेकिन यह भी यह एक कर देगा पुरानी शैली की कक्षा और C.__bases__
अनुपलब्ध होगा इस प्रकार मैं C
के आधार पर अतिरिक्त ऑब्जेक्ट्स नहीं जोड़ सकता है इसके लिए एक अच्छा आर्किटेक्चरल समाधान क्या होगा और आप ऐसा कुछ कैसे करेंगे? अभी के लिए मैं प्लगइन के लिए पुरानी शैली के वर्गों के साथ रह सकता हूं। लेकिन मैं उनका उपयोग नहीं करता हूं।
पुरानी शैली कक्षाएं पायथन 3 में मौजूद नहीं हैं, इसलिए आपको अंततः समाधान की आवश्यकता होगी। –
वास्तव में वास्तव में सच है। –