如何覆盖`is`运算符

时间:2010-11-12 01:26:59

标签: python operators

  

可能重复:
  python: class override “is” behavior

我正在尝试覆盖is运算符,以便我可以执行类似

的操作
if tom is writer:
   print 'tom is writing'
elif tom is programmer:
   print 'tom is programming'

这在python中是否可行?

2 个答案:

答案 0 :(得分:5)

据我所知,你不能覆盖'is',因为它通过比较它们的内存地址(即指针比较)来测试两个对象是否是同一个对象。您可能希望通过实现tom的__eq__方法来覆盖'=='。

答案 1 :(得分:3)

测试对象类型的Python方法是使用isinstance,如isinstance(tom,Writer)中所示。

但是每当你开始编写类似于你的例子的代码时,请考虑使用多态。这是一个简单的类层次结构,可以执行您想要的操作,而无需单次调用isinstance:

class Worker(object):
    def __init__(self, name):
        self.name = name

    def is_doing(self):
        return "working"

class Writer(Worker):
    def is_doing(self):
        return "writing"

class Programmer(Worker):
    def is_doing(self):
        return "programming"

workers = [
    Writer("Tom"),
    Programmer("Dick"),
    ]

for w in workers:
    print "%s is %s" % (w.name, w.is_doing())

打印:

Tom is writing
Dick is programming

现在你可以向Worker添加新的子类并实现is_doing,而不必维护一些类型到活动值的表。

这种多态性模式是传统的OO,但在Python中,您甚至不限于Worker的子类 - 任何实现is_doing且具有name属性的对象都可以工作:

class Fish(object):
    def __init__(self, n):
        self.name = n
    def is_doing(self):
        return "swimming"

workers.append(Fish("Wanda"))

for w in workers:
    print "%s is %s" % (w.name, w.is_doing())

将打印:

Tom is writing
Dick is programming
Wanda is swimming