Не используйте 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» либо не ожидают никаких аргументов (что является текущим вариантом использования), либо все они ожидают одинаковых аргументов.