तो, मेरे पास सीरियल एपीआई के लिए बड़ी संख्या में संदेश पेलोड कक्षाएं हैं, जिनमें से प्रत्येक में कई अपरिवर्तनीय फ़ील्ड, एक पार्स विधि और साझा की जाने वाली कुछ विधियां हैं। जिस तरह से मैं इसे संरचित कर रहा हूं वह यह है कि प्रत्येक क्षेत्र के व्यवहार के लिए नामांकित से उत्तराधिकारी होगा, और माता-पिता वर्ग से सामान्य तरीकों को प्राप्त करेगा। हालांकि, मैं कंस्ट्रक्टर्स के साथ कुछ कठिनाइयां आ रही हूँ:पायथन में, मैं सुपर क्लास को कैसे कॉल करूं जब यह एक-ऑफ नामित है?
class Payload:
def test(self):
print("bar")
class DifferentialSpeed(Payload, namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')):
__slots__ =()
def __init__(self, **kwargs):
super(DifferentialSpeed, self).__init__(**kwargs)
# TODO: Field verification
print("foo")
@classmethod
def parse(self, raw):
# Dummy for now
return self(left_speed = 0.0, right_speed = 0.1,
left_accel = 0.2, right_accel = 0.3)
def __str__(self):
return "Left Speed: %fm/s\nRight Speed: %fm/s\n"\
"Left Acceleration: %fm/s^2\nRight Acceleration: %fm/s^2" % (
self.left_speed, self.right_speed, self.left_accel, self.right_accel)
payload = DifferentialSpeed.parse('dummy')
print(payload)
यह काम करता है, लेकिन मैं निम्नलिखित चेतावनी मिलती है: यदि मैं कॉल से **kwargs
हटाने
DeprecationWarning: object.__init__() takes no parameters
super(DifferentialSpeed, self).__init__(**kwargs)
, यह अभी भी काम करने के लिए लगता है, लेकिन क्यों? कन्स्ट्रक्टर को नामांकित करने के लिए उन तर्कों को कैसे पारित किया जा रहा है? क्या यह गारंटी है, या mro कैसे स्थापित किया गया है इसका यादृच्छिक परिणाम है?
अगर मैं सुपर से दूर रहना चाहता हूं, और इसे पुराना तरीका करना चाहता हूं, तो क्या मैं अपने कन्स्ट्रक्टर को कॉल करने के लिए नामांकित तक पहुंच सकता हूं? मुझे यह करने की ज़रूरत नहीं है:
DifferentialSpeed_ = namedtuple('DifferentialSpeed_',
'left_speed right_speed left_accel right_accel')
class DifferentialSpeed(Payload, DifferentialSpeed_):
वर्बोज़ और अनावश्यक लगता है।
यहां मेरा सबसे अच्छा तरीका क्या है? क्योंकि समय __init__
द्वारा वस्तु पहले से ही निर्माण किया है कहा जाता है
ध्यान दें कि आप 'namedtuple' उपयोग करने के लिए स्मृति को बचाने के लिए कोशिश कर रहे हैं, तो आप' निर्धारित करने की आवश्यकता __slots__ =() 'व्युत्पन्न वर्ग के साथ ही अन्य विरासत में मिला' Payload' वर्ग, या कक्षा में अभी भी '__dict__' होगा। –