【问题标题】:Overloading operators for custom types in PythonPython中自定义类型的重载运算符
【发布时间】:2014-11-28 23:54:03
【问题描述】:

我正在尝试在 Python 中模拟一种称为“前缀树”的东西。

我的班级有__contains__ 方法,所以我可以检查这棵树中是否有给定的单词:

class PrefTree():
    ...
    def __contains__(self, word):
        #some code...
    ...

pt = PrefTree()
...
w = "someword"
if w in pt:
    print("Aye, found it.")

但我也想有一些特殊的__contains__ 方法来使用特殊规则检查成员资格。所以我需要“另一个”in 操作员来使用这种方法检查成员资格。实现它的最佳方法是什么?

【问题讨论】:

  • 不确定我是否理解您的问题。您不能创建新的运算符。只有一个in 运算符,你可以重载它来做一件事(每个类)。如果你有另一种容器要测试,你可以使用另一个现有的运算符,或者只是给你的类一个方法,以便人们调用obj.specialContains(whatever)
  • 没错,我可以为此添加一个方法,但在我看来,如果我能做到if w special_in pt,它看起来会更好,更pythonic
  • 好吧,你不能。您不能定义自己的运算符;您只能为现有运算符定义行为。
  • 在使用in 运算符时,我能否以某种方式将其他参数传递给__contains__ 方法?
  • 您可以让__contains__ 接收一个元组。例如。 (a, b, c) in pt 在这种情况下,您可能会根据所使用对象的类型或元组中的项目数等有不同的行为。我不建议这种愚蠢的行为。

标签: python operator-overloading overloading


【解决方案1】:

只有一个__contains__ 实现应该适用于给定的w 吗?那么,是什么决定了适用特殊规则还是标准规则? (w的一些特点?)

如果您的班级用户始终可以使用任何w,那么显然您需要两种不同的方法。

但是,如果 w 决定使用哪个实现,您可以定义 PrefixTree 的超类 - PrefixTreeBase,比如说 - 包含 __contains__ 的默认实现,然后 PrefixTree 实现看起来像这样:

def __contains__(self, w):
    if self._is_special(w):
        return self._special_rule(w)
    return super().__contains__(w)

_*special* 方法实现了您的特殊性概念。

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多