بيثون السيناريو قيد التشغيل. لدي اسم طريقة كسلسلة. كيف أسمي هذه الطريقة؟

StackOverflow https://stackoverflow.com/questions/2344212

  •  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())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top