如何重载`is`运算符
可能是重复的问题:
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__
方法来做到。