بيثون السيناريو قيد التشغيل. لدي اسم طريقة كسلسلة. كيف أسمي هذه الطريقة؟
-
23-09-2019 - |
سؤال
كل واحد. يرجى الاطلاع على مثال أدناه. أرغب في توفير سلسلة إلى طريقة "chainve_action" التي تحدد ، ما هي طريقة فئة الروبوت التي ينبغي استدعاؤها. في المثال أدناه ، قمت بتمثيله باسم "bot.action ()" لكن ليس لدي أي فكرة عن كيفية القيام بذلك بشكل صحيح. الرجاء المساعدة
class Bot:
def work(self): pass
def fight(self): pass
class Scheduler:
def schedule_action(self,action):
bot = Bot()
bot.action()
scheduler = Scheduler()
scheduler.schedule_action('fight')
المحلول
يستخدم getAttr:
class Bot:
def fight(self):
print "fighting is fun!"
class Scheduler:
def schedule_action(self,action):
bot = Bot()
getattr(bot,action)()
scheduler = Scheduler()
scheduler.schedule_action('fight')
لاحظ أن GetAttr يأخذ أيضًا وسيطة اختيارية تتيح لك إرجاع قيمة افتراضية في حالة عدم وجود الإجراء المطلوب.
نصائح أخرى
بالمختصر،
getattr(bot, action)()
سيبحث GetAttr عن سمة على الكائن بالاسم - يمكن أن تكون السمات من البيانات أو أساليب الأعضاء الإضافية ()
في النهاية يستدعي الطريقة.
يمكنك الحصول على الطريقة في خطوة منفصلة ، مثل هذه ، أيضًا:
method_to_call = getattr(bot, action)
method_to_call()
ويمكنك نقل الحجج إلى الطريقة بالطريقة المعتادة:
getattr(bot, action)(argument1, argument2)
أو
method_to_call = getattr(bot, action)
method_to_call(argument1, argument2)
لست متأكدًا مما إذا كان ذلك ينطبق في وضعك ، ولكن قد تفكر في استخدام مؤشر وظيفة بدلاً من معالجة الأوتار.
class Bot:
def work(self):
print 'working'
def fight(self):
print 'fightin'
class Scheduler:
def schedule_action(self,action):
bot = Bot()
action(bot)
scheduler = Scheduler()
scheduler.schedule_action(Bot.fight)
scheduler.schedule_action(Bot.work)
الذي يطبع:
fightin
working
إذا كنت تستطيع القيام بذلك ، فسوف يمنحك خطأ في وظيفة إملائية في وقت الترجمة عندما يتم تفسير الكود بدلاً من أثناء وقت التشغيل. قد يؤدي ذلك إلى تقصير دورة تصحيح الأخطاء لأخطاء دخول البيانات الغبية ، خاصةً إذا تم إجراء الإجراءات على مدار فترة زمنية. لا شيء يمتص أكثر من تشغيل شيء بين عشية وضحاها واكتشاف أن لديك خطأ في بناء الجملة في الصباح.
class Scheduler:
def schedule_action(self,action):
bot = Bot()
boundmethod = getattr(bot, action)
boundmethod()
def schedule_action(self,action):
bot = Bot()
bot.__getattribute__(action)()
يمكنك أيضًا استخدام قاموس لتعيين أساليب الإجراءات. على سبيل المثال:
ACTIONS = {"fight": Bot.fight,
"walk": Bot.walk,}
class Scheduler:
def schedule_action(self, action):
return ACTIONS[action](Bot())