Python重载同名函数:实现两种特征设置函数的最简方案
问题:实现两个版本的特征设置函数的最简方法?
我需要实现两个版本的特征设置函数:一个接收全部特征并将其拆分为单词和短语,另一个接收已拆分好的单词和短语作为参数。现有代码如下,请问实现这一需求的最简单方法是什么?
现有代码:
def set_features_2(self, words, phrases): self.vocabulary = set(words) self.phrases = SortedSet(phrases) def set_features(self, features): phrases = [f for f in features if ' ' in f] words = [f for f in features if f not in phrases] self.set_features_2(words, phrases)
回答
嘿,其实你现在的写法已经是非常简洁且合理的实现方式了!核心思路就是让两个函数各司其职,完全符合代码复用的最佳实践:
set_features_2专注于最终的特征赋值逻辑,只需要把传入的已拆分好的单词和短语存入实例变量就行;set_features则专门干预处理拆分的活儿,把原始特征列表拆成单词和短语后,直接调用set_features_2来完成后续操作,完全避免了重复代码。
如果想要让代码更优雅一点,可以做两个小优化:
- 给
set_features_2改个更语义化的名字,比如叫_set_features_from_split(用下划线开头暗示这是内部方法,不建议外部直接调用),这样其他开发者一看就知道这个函数是给内部拆分后的特征用的; - 拆分单词的时候,把短语列表改成集合:
def set_features(self, features): phrases = {f for f in features if ' ' in f} # 用集合代替列表,提升查询效率 words = [f for f in features if f not in phrases] self._set_features_from_split(words, phrases)
因为集合的in操作是O(1),而列表的in操作是O(n),当特征数量很大的时候,这个小改动能明显提升性能。
总的来说,你当前的实现已经是“最简且职责清晰”的方案了——复用已有逻辑,不重复造轮子,完全踩中了DRY原则(Don't Repeat Yourself)的点~
内容的提问来源于stack exchange,提问作者Alicja Głowacka




