पायथन सजावट करने के लिए मजेदार हैं, लेकिन ऐसा लगता है कि सजावट करने वालों के तर्कों के कारण मुझे दीवार पर मारा गया है। यहां मेरे पास बेस क्लास के हिस्से के रूप में परिभाषित एक सजावटी है (सजावटी कक्षा के सदस्यों तक पहुंच जाएगा इसलिए इसे स्वयं पैरामीटर की आवश्यकता होगी)।आधार वर्ग का हिस्सा हैं जो पाइथन सजावट का उपयोग विरासत कक्षाओं में सदस्य कार्यों को सजाने के लिए नहीं किया जा सकता है
class SubSystem(object):
def UpdateGUI(self, fun): #function decorator
def wrapper(*args):
self.updateGUIField(*args)
return fun(*args)
return wrapper
def updateGUIField(self, name, value):
if name in self.gui:
if type(self.gui[name]) == System.Windows.Controls.CheckBox:
self.gui[name].IsChecked = value #update checkbox on ui
elif type(self.gui[name]) == System.Windows.Controls.Slider:
self.gui[name].Value = value # update slider on ui
...
मैंने बाकी कार्यान्वयन को छोड़ दिया है। अब यह वर्ग विभिन्न उप-प्रणालियों के लिए एक बेस क्लास है जो इसके उत्तराधिकारी होंगे - कुछ विरासत वाले वर्गों को अपडेटगुआई सजावट का उपयोग करने की आवश्यकता होगी।
class DO(SubSystem):
def getport(self, port):
"""Returns the value of Digital Output port "port"."""
pass
@SubSystem.UpdateGUI
def setport(self, port, value):
"""Sets the value of Digital Output port "port"."""
pass
एक बार फिर मैंने फ़ंक्शन कार्यान्वयन को छोड़ दिया है क्योंकि वे प्रासंगिक नहीं हैं।
unbound method UpdateGUI() must be called with SubSystem instance as first argument (got function instance instead)
कम समस्या में है कि जब मैं SubSystem.UpdateGUI के रूप में यह specifiying द्वारा डेकोरेटर विरासत में मिला वर्ग से आधार वर्ग में परिभाषित का उपयोग कर सकते हैं, मैं अंत में इस लेखन त्रुटि जब इसका इस्तेमाल करने की कोशिश कर मिलता है
ऐसा इसलिए है क्योंकि मेरे पास सजावट करने के लिए self
पैरामीटर को पारित करने का कोई तत्काल पहचान योग्य तरीका नहीं है!
क्या ऐसा करने का कोई तरीका है? या क्या मैं पाइथन में वर्तमान सजावटी कार्यान्वयन की सीमा तक पहुंच गया हूं?
यह काम किया! कभी भी सजावटी को एक वर्ग के तरीके में बदलने का विचार नहीं किया होता। – Aphex
भविष्य के संदर्भ के लिए, यह वास्तव में def UpdateGUI (स्वयं, मजेदार) से पहले @classmethod जोड़कर एक पंक्ति तय किया गया था। – Aphex
@ एफेक्स। केनीटीएम के रूप में आपको 'सीएलएस' के उपयोग से 'स्वयं' के उपयोग को प्रतिस्थापित करना चाहिए। यह आपके कोड को पढ़ने के लिए बहुत आसान बना देगा। – aaronasterling