迭代指定类的方法

时间:2018-05-30 00:24:00

标签: python

假设这样的mininal Mixin分组多种方法

class Mixin:
    "Iterate methods"
    def strip():
        return str.strip

    def title():
        return str.title

    def swapcase():
        return str.swapcase

处理文本片段的方法

content = "iterate methods  "
content = Mixin.strip()(content)
content = Mixin.title()(content)
content = Mixin.swapcase()(content)
print(content)

我将代码重新编写为:

ops = [Mixin.strip(), Mixin.title(), Mixin.swapcase()]
for function in ops:
    content = function(content)
print(content)

我想知道如何将其简化为

for function in Mixin:
    content = function(content)
print(content)

我试过dir(Mixin),但这并不令人满意。

In [33]: [method for method in dir(Mixin) if not method.startswith("__")]
Out[33]: ['strip', 'swapcase', 'title']`

2 个答案:

答案 0 :(得分:3)

我同意abarnert,这似乎是一个类/ Mixin的奇怪用法。但是,您可以使用getattr

,而不是质疑您的用例,作为问题的部分答案

getattr允许您获取给定名称的对象的属性。

所以,例如:

for method in (attr for attr in dir(Mixin) if not attr.startswith('__')):
    content = getattr(Mixin, method)()(content)

但是,鉴于迭代没有特定的顺序,结果可能不是确定性的。

最好的方法是使用特定订单,例如:

for method in ['strip', 'title', 'swapcase']:
    content = getattr(Mixin, method)()(content)

答案 1 :(得分:0)

我认为Havok的答案非常好,但是因为juanpa.arrivillaga说使用dir这里不好用,我有一个不使用dir的解决方案,使用{{ 1}}:

vars

输出:

class Mixin:
    "Iterate methods"
    def strip(s):
        return s.strip()

    def title(s):
        return s.title()

    def swapcase(s):
        return s.swapcase()

content = "iterate methods   "
for function in reversed([i for i in vars(Mixin) if not i.startswith('_')]):
    content = getattr(Mixin, function)(content)
print(content)