【问题标题】:How to Call Multiple Methods in Python Class Without Calling Each on Individually?如何在 Python 类中调用多个方法而不单独调用每个方法?
【发布时间】:2019-01-15 20:05:16
【问题描述】:

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

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”开头,无论它们是什么是)

【问题讨论】:

  • exec 不是eval。也不要对副作用使用理解。
  • 我也试过eval。结果相同。
  • 属性优先于 set 这样简单定义的方法 - stackoverflow.com/a/52201774/2308683
  • 没有任何解释而投反对票的人能否提供一份?

标签: python-3.x class methods


【解决方案1】:

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

【讨论】:

  • 很好奇 - 如何为@property 应用类似的模式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多