سؤال

أنا أستخدم Argparse في برنامج Python الخاص بي وأريد أن أتصل طريقة عندما أقوم بتشغيل برنامجي مثل هذا:

$ python __init__.py foo

من السهل إذا كنت أرغب في استدعاء وظيفة بدلاً من طريقة:

def foo(args):
    pass

def main():
    foo_parser.set_defaults(func=foo)

if __name__ == "__main__":
    main()

كيف يمكنني استبدال "func = foo" بواسطة "func = myclass.my_method"؟

هل كانت مفيدة؟

المحلول

يمكنك فقط الرجوع إلى الطريقة بدلاً من الوظيفة. نعم. انه من السهل. بدلاً من

 func = foo

أنت تفعل

 func = theobject.foo

فعله!

نصائح أخرى

أعطيت الإجابة الصحيحة بنفسك. فقط ضع:

func = Your_Class.your_method

بدلاً من:

func = foo

هل تبحث عن شيء مثل هذا:

import argparse

class Myclass(object):

    def foo(self):
        print 'foo'

    def bar(self):
        print 'bar'

class Main(Myclass):

    def __init__(self):
        foo_parser = argparse.ArgumentParser()

        foo_parser.add_argument('method')
        self.args = foo_parser.parse_args()

    def __call__(self, *args, **kws):
        method = self.args.method
        return getattr(self, method)(*args, **kws)

if __name__ == "__main__":
    main = Main()

    main()

مثال على الاستخدام:

$ python test.py foo
'foo'
$ python test.py bar
'bar'

إذا كان من خلال "الطريقة" تعني "طريقة المثيل": لا يمكنك الاتصال بأسلوب مثيل باستخدام مثيل ، لذلك تحتاج إلى مثيل أولاً. ثم ، يمكنك الرجوع فقط obj.method والحصول على BoundMethod الذي يتذكر المثيل (obj) - على سبيل المثال:

class Cls:
    def __init__(self, x):
        self.x = x
    def foo(self, new_x):
        self.x = new_x

obj = Cls(1)
foo = obj.foo
foo(2) # same as obj.foo(), but we don't need to keep obj for this!
print(obj.x) #=>2

إذا كانت ثابتة (إذا كان الأمر كذلك ، فلماذا؟ في 99 ٪ من الوظائف الحرة تكون أبسط في الاستخدام والعمل أيضًا) أو طريقة الفصل ، فقط راجع Cls.method.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top