【问题标题】:How do you return the results of all the methods of a class object as one list?如何将类对象的所有方法的结果作为一个列表返回?
【发布时间】:2014-06-20 11:49:27
【问题描述】:

如何将一个类对象的所有方法的结果作为一个列表返回?

class Example(object):

  def Calc1(self):
     return 1

  def Calc3(self):
     return 2

  def Calc5(self):
     return 3


Desired_Result = [1,2,3]

我不想使用这样的常用方法:

Desired_Result = [Example().Calc1(),Example().Calc3(),Example().Calc5()]

我希望该函数具有可扩展性,因为该类可以有十个或数百个方法,这样我就不必键入每个方法。

此外,获得方法名称的奖励积分也是如此。

Desired_Result2 = ['Calc1','Calc3','Calc5']

【问题讨论】:

  • 如果方法有参数怎么办?
  • 我还不关心参数,因为我目前只对没有参数的方法感兴趣。但是,如果有一种方法可以对带有参数的方法执行此操作,那将非常有帮助,但不确定这有多大可能。
  • 嗯,这是不可能的,除非您期望为每个方法的每个可能的参数(可能是无限多的)获取返回值。您实际上想通过这样做来实现什么?可能有更好的方法。

标签: python list class methods


【解决方案1】:

试试:

import inspect
# Class def here
instance = ClassDef()
methods = {m[0]: m[1] for m in inspect.getmembers(instance) if inspect.ismethod(m[1])}
method_results = {k: v() for k, v in methods.items()}  # only works for methods that take only one argument (the instance)

请注意,上面的最后一行仅适用于采用单个参数(实例)的方法。你可以得到名字和方法的结果组合如下:

print method_results
{'Calc1': 1, 'Calc3': 2, 'Calc5': 3}

只是方法的结果:

print [v() for v in method_results.values()]
[1, 2, 3]

【讨论】:

  • 我更喜欢这种方法,但我认为您需要更进一步地采用这种方法。 OP 想要每个方法的输出。也就是说,OP想要名称 [1,2,3].
  • 试试这个,除了你已经拥有的:methods = {m[0]: m[1] for m in inspect.getmembers(instance) if inspect.ismethod(m[1])}{k: v() for k, v in methods.items()}
  • 如果您对我的修改不满意,请随时撤消我的修改。
【解决方案2】:

注意my comment(现在编辑)关于 AMacK 的回答。我认为这个答案是最好的。不过,作为记录,我最初提出这是另一种可行(现在不太可取)的替代方案:

>>> e = Example()  # create a generic instance
>>> methods = {k: v for k, v in Example.__dict__.items() if hasattr(v, '__call__')}
>>> [v(e) for v in methods.values()]
[1, 2, 3]
>>> {k: v(e) for k, v in methods.items()}  # will only work if all methods take only one argument, the instance
{'Calc1': 1, 'Calc3': 2, 'Calc5': 3}

请注意,这种方法(以及 AMacK 当前的方法)仅适用于需要一个参数(实例)的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    相关资源
    最近更新 更多