Python:询问两个对象是否属于同一类

22

我有一个Animal类,其他动物继承自它(例如Sheep,Wolf)。
我想检查两个对象是否属于同一类,如果是,则应创建相同类的新对象;如果不是,则它们会打斗。

if x and y same object:
    #create new object
else:
    #fight

有比isinstance更好的方法吗?
因为会有不止两种动物,我认为这样做不太有效率:

if isinstance(x, Wolf)
    # ...
2个回答

28

你可以简单地使用

if type(x) == type(y):
    fight()

Python有一个类型系统,可以让你做到这一点。

编辑:正如Martijn所指出的那样,由于每个运行时中类型只存在一次,因此您可以使用is而不是==

if type(x) is type(y):
    fight()

8
类是单例的,因此使用 type(x) is type(y) 更有效率。 - Martijn Pieters
你说得对!@MartijnPieters,怎么你总是注意到我马虎的时候? ;) - Marcus Müller
1
更好的选择是直接将此任务委托给实例,在方法中了解类型。def fight(self, other): if not isinstance(self, Wolf): return NotImplemented,等等。 - Martijn Pieters
1
@MartijnPieters:我基本上同意,并且它感觉更像是C++(这也是我最喜欢的地方);我甚至会过载+/__add__运算符!此外,如果你将所有的动物都派生自同一个基类,你只需检查if not isinstance(other, type(self)),它就会按照预期工作。事实上,这甚至让我觉得应该编写一个装饰器,以便可以定义只接受与包含类相同类型参数的方法! - Marcus Müller

-5
如果 obj1==obj2: pass else: # do some

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
3
这个比较太严格了;问题只要求对象是同一类的实例,而不需要像这个答案一样彼此相等。 - OrOrg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接