Как вызвать несколько методов в классе Python, не вызывая каждый по отдельности? - PullRequest
0 голосов
/ 15 января 2019

У меня есть класс, который содержит несколько методов: </p> <pre><code>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 Ответ

0 голосов
/ 15 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...