如何让Python Mixin类支持直接迭代其内部方法?
实现Mixin类的直接遍历调用方法
要实现直接遍历Mixin类来调用其封装的字符串处理方法,核心是让类本身支持迭代——Python中要让一个对象(包括类对象)可迭代,需要实现__iter__方法。下面是具体的改造方案:
改造后的Mixin类
class Mixin: """Iterate methods""" @classmethod def strip(cls): return str.strip @classmethod def title(cls): return str.title @classmethod def swapcase(cls): return str.swapcase @classmethod def __iter__(cls): # 遍历类的所有属性,筛选出自定义的方法(排除内置特殊方法) for attr_name in dir(cls): # 排除以双下划线开头的特殊属性,同时排除__iter__自身 if not attr_name.startswith('__') and attr_name != '__iter__': attr = getattr(cls, attr_name) # 确认是可调用的方法,然后返回方法的实际返回值(即str的对应处理方法) if callable(attr): yield attr()
用法示例
现在你可以直接按照需求遍历Mixin类处理文本了:
content = " hello world " for function in Mixin: content = function(content) print(content)
运行后会依次输出:
hello world Hello World hELLO wORLD
关键细节解释
- 类方法改造:把原Mixin中的
strip()、title()等方法改为@classmethod,这样类本身可以直接调用这些方法,不需要实例化。 - __iter__类方法:定义成类方法后,
Mixin类对象本身就能被for循环遍历。这个方法会:- 用
dir(cls)获取类的所有属性名; - 筛选掉内置特殊方法(以
__开头的)和__iter__自身; - 通过
getattr(cls, attr_name)拿到方法对象,调用后得到str.strip、str.title这些实际处理字符串的函数; - 用
yield逐个返回这些函数,实现迭代。
- 用
- 为什么原dir(Mixin)不行:
dir()返回的只是方法名称的字符串列表,而不是可直接调用的方法对象,我们需要通过getattr把名称映射到实际的方法,再调用原方法拿到最终要使用的字符串处理函数。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

