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