You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python方法链式调用中能否实现方法分组/分层?

Python方法链式调用中能否实现方法分组/分层?

当然可以实现你想要的这种分层链式调用!你的思路方向完全正确,只是当前代码里的方法返回值处理得有点问题——现在每个层级的方法返回的是父类实例(TextPreprocessor),所以每次调用完一个方法都得重新指定层级,才会显得格外啰嗦。

我们只需要做两个关键调整,就能实现你想要的简洁链式写法:

  1. 让每个层级处理器的方法返回当前层级的实例,而非父实例,这样同层级内可以连续调用方法
  2. 在每个层级类里通过属性代理父实例的其他层级,让你能直接从当前层级切换到目标层级

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:37:57