Python方法链式调用中能否实现方法分组/分层?
Python方法链式调用中能否实现方法分组/分层?
当然可以实现你想要的这种分层链式调用!你的思路方向完全正确,只是当前代码里的方法返回值处理得有点问题——现在每个层级的方法返回的是父类实例(TextPreprocessor),所以每次调用完一个方法都得重新指定层级,才会显得格外啰嗦。
我们只需要做两个关键调整,就能实现你想要的简洁链式写法:
- 让每个层级处理器的方法返回当前层级的实例,而非父实例,这样同层级内可以连续调用方法
- 在每个层级类里通过属性代理父实例的其他层级,让你能直接从当前层级切换到目标层级
修改后的完整代码
import re class TextLevelPreprocessor: def __init__(self, parent): self.parent = parent # 代理父实例的其他层级属性 @property def sentence_level(self): return self.parent.sentence_level @property def token_level(self): return self.parent.token_level def lower_case(self): self.parent.text = self.parent.text.lower() return self # 返回当前层级实例,保持同层级链式调用 class SentenceLevelPreprocessor: def __init__(self, parent): self.parent = parent # 代理父实例的其他层级属性 @property def text_level(self): return self.parent.text_level @property def token_level(self): return self.parent.token_level def split_sentences(self): self.parent.text = self.parent.text.split('. ') return self # 返回当前层级实例 def remove_special_characters(self): self.parent.text = [re.sub('[!@#$]', '', s) for s in self.parent.text] return self # 返回当前层级实例 class TokenLevelPreprocessor: def __init__(self, parent): self.parent = parent # 代理父实例的其他层级属性 @property def text_level(self): return self.parent.text_level @property def sentence_level(self): return self.parent.sentence_level def tokenize(self): self.parent.text = [t.split() for t in self.parent.text] return self.parent # 最后返回父实例,方便直接取处理后的text class TextPreprocessor: def __init__(self, text): self.text = text self.text_level = TextLevelPreprocessor(self) self.sentence_level = SentenceLevelPreprocessor(self) self.token_level = TokenLevelPreprocessor(self)
现在你可以用最理想的写法调用了
text = "This is an example foo text with some special characters!!!! And some sentences" pr = TextPreprocessor(text) processed_text = ( pr.text_level.lower_case() .sentence_level.split_sentences().remove_special_characters() .token_level.tokenize() .text )
核心逻辑说明
- 每个层级的方法返回自身,保证在同一个层级(比如
sentence_level)里可以连续调用多个方法,不用重复写层级前缀 - 通过
@property代理父实例的其他层级属性,让你能直接从当前层级实例切换到其他层级,实现跨层级的流畅链式调用 - 所有层级的预处理操作都直接修改父实例的
text属性,确保整个 pipeline 的数据状态统一
这种设计完美适配你的文本预处理场景,把不同粒度的操作(文本级、句子级、词元级)清晰分组,同时保持链式调用的简洁性。
备注:内容来源于stack exchange,提问作者The Central Scrutinizer
相关产品推荐
相关产品推荐

