我正在尝试覆盖is
运算符,以便我可以执行类似
if tom is writer:
print 'tom is writing'
elif tom is programmer:
print 'tom is programming'
这在python中是否可行?
答案 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