假设这样的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']`
答案 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)