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