如何重载`is`运算符

4 投票
2 回答
1293 浏览
提问于 2025-04-16 06:57

可能是重复的问题:
python: 类重写“is”行为

我想要重写 is 运算符,这样我就可以做一些像下面这样的事情:

if tom is writer:
   print 'tom is writing'
elif tom is programmer:
   print 'tom is programming'

在Python中,这可能吗?

2 个回答

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这个方法,就不需要维护一个类型和活动的对应表了。

这种多态的模式是传统的面向对象编程方式,但在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
6

据我所知,你不能重写'is'这个东西,因为它是用来判断两个对象是不是同一个对象,也就是比较它们在内存中的地址(也就是指针比较)。你可能想要重写的是'==',可以通过实现tom的__eq__方法来做到。

撰写回答