में गतिशील रूप से फ़ंक्शन कार्यान्वयन असाइन करना मैं गतिशील रूप से फ़ंक्शन कार्यान्वयन असाइन करना चाहता हूं।पाइथन
के निम्नलिखित साथ शुरू करते हैं:
class Doer(object):
def __init__(self):
self.name = "Bob"
def doSomething(self):
print "%s got it done" % self.name
def doItBetter(self):
print "Done better"
अन्य भाषाओं में हम एक गुमनाम समारोह doItBetter बनाने के लिए और वस्तु के लिए असाइन करें करेंगे। लेकिन पायथन में अज्ञात कार्यों के लिए कोई समर्थन नहीं है। इसके बजाय, हम एक प्रतिदेय वर्ग उदाहरण बनाने की कोशिश करेंगे, और वर्ग के लिए है कि आवंटित:
class Doer(object):
def __init__(self):
self.name = "Bob"
class DoItBetter(object):
def __call__(self):
print "%s got it done better" % self.name
Doer.doSomething = DoItBetter()
doer = Doer()
doer.doSomething()
कि मुझे इस देता है:
Traceback (most recent call last): Line 13, in doer.doSomething() Line 9, in call print "%s got it done better" % self.name AttributeError: 'DoItBetter' object has no attribute 'name'
अंत में, मैं के रूप में वस्तु उदाहरण के लिए प्रतिदेय बताए की कोशिश की एक विशेषता है और यह बुला:
class Doer(object):
def __init__(self):
self.name = "Bob"
class DoItBetter(object):
def __call__(self):
print "%s got it done better" % self.name
doer = Doer()
doer.doSomething = DoItBetter()
doer.doSomething()
यह रूप में लंबे समय से काम करता है मैं DoItBetter में स्वयं को संदर्भित नहीं है, लेकिन यह मुझे क्योंकि यह संदर्भित है self.name
पर एक नाम त्रुटि देता है जब मैं करता हूँ कॉल करने योग्य self
, मालिक वर्ग self
नहीं है।
तो मैं क्लास फ़ंक्शन या इंस्टेंस विधि में अज्ञात फ़ंक्शन असाइन करने के लिए एक पाइथोनिक तरीका ढूंढ रहा हूं, जहां विधि कॉल ऑब्जेक्ट के self
का संदर्भ दे सकती है।
आपके द्वारा अस्वीकार किए गए पहले दृष्टिकोण के साथ कुछ भी गलत नहीं है। आप इसे इतना जटिल क्यों बना रहे हैं? –
आपकी त्रुटि वास्तव में अजीब है - क्या आप एक रूबी दुभाषिया के साथ एक पायथन स्क्रिप्ट चलाने की कोशिश कर रहे हैं? (आपकी फ़ाइल को 'prog.rb' कहा जाता है,' .py' पायथन फ़ाइल एक्सटेंशन है)। त्रुटि निश्चित रूप से पायथन से नहीं है - 'self' पायथन में कोई कीवर्ड नहीं है। –
मेरी गलती- इसे रूबी सेटिंग्स के साथ ऑनलाइन कोडपैड पर चलाया गया- निश्चित – Yarin