Python 3.x 如何在Python类中调用多个方法而不单独调用每个方法?

Python 3.x 如何在Python类中调用多个方法而不单独调用每个方法?,python-3.x,class,methods,Python 3.x,Class,Methods,我有一个包含许多方法的类: 我有很多这样的方法,都是以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

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

我有很多这样的方法,都是以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”开头)

不要使用
exec
eval
。而是使用
getattr

还要注意,
set\u 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”方法不需要任何参数(这是当前的用例),或者它们都需要相同的参数,这个解决方案就可以工作。

exec
不是
eval
。也不要用理解来判断副作用。我也试过
eval
。同样的结果。对于这样简单的定义,属性比设置方法更受欢迎-在没有任何解释的情况下被否决的人会提供一个吗?奇怪的是-如何将一个简单的模式应用于
@property
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