代码之家  ›  专栏  ›  技术社区  ›  Josh

如何在不单独调用每个方法的情况下调用Python类中的多个方法?

  •  -1
  • Josh  · 技术社区  · 6 年前

    我有一个包含许多方法的类:

    class PersonalDetails(ManagedObjectABC):
        def __init__(self, personal_details):
            self.personal_details = personal_details
        def set_gender(self):
            self.gender='Male:
        def set_age(self):
            self.set_age=22
        etc.
    

    我有很多这样的方法,都是以“set”这个词开头的。我想在此类中创建一个新方法,该方法将执行以set开头的所有方法,如下所示:

    def execute_all_settings(self):
        '''
        wrapper for setting all variables that start with set.
        Will skip anything not matching regex '^set'
        '''
        to_execute=[f'''self.{i}()''' for i in dir(self) if re.search('^set',i)
        print(to_execute)
        [exec(i) for i in to_execute]
    

    但是,这会报告一个错误:

    NameError: name 'self' is not defined
    

    我该怎么做呢?

    更多信息

    我之所以想这样做,而不是简单地单独调用每个方法,是因为将来可能会添加新方法,所以我希望执行所有方法(不管它们是什么,都以“set”开头)

    1 回复  |  直到 6 年前
        1
  •  1
  •   DeepSpace    6 年前

    也不要使用 exec eval . 代替使用 getattr .

    还要注意 set_age 同时是方法和属性,请尝试避免这种情况。

    import re
    
    class PersonalDetails:
        def __init__(self, personal_details):
            self.personal_details = personal_details
    
        def set_gender(self):
            self.gender = 'Male'
    
        def set_age(self):
            self.age = 22
    
        def execute_all_settings(self):
            '''
            wrapper for setting all variables that start with set.
            Will skip anything not matching regex '^set'
            '''
            to_execute = [i for i in dir(self) if re.search('^set', i)]
            print(to_execute)
            for func_name in to_execute:
                getattr(self, func_name)()
    
    pd = PersonalDetails('') 
    pd.execute_all_settings() 
    print(pd.gender)
    # ['set_age', 'set_gender']
    # Male
    

    只要所有“set”方法都不需要任何参数(即当前的用例),或者它们都需要相同的参数,这个解决方案就可以工作。