如何比较Python中的两个类/类型?

2024-02-19

我在模块中定义了两个类classes.py:

class ClassA(object):
    pass

class ClassB(object):
    pass

在另一个模块中,我获取了该模块的属性:

import classes

Class1 = getattr(classes, 'ClassA')
Class2 = getattr(classes, 'ClassA')
print type(Class1) == type(Class2)

Class3 = getattr(classes, 'ClassA')
Class4 = getattr(classes, 'ClassB')
print type(Class3) == type(Class4)

两种类型比较都返回 True,这不是我所期望的。

如何使用 python 的本机类型值比较类类型?


解释

这就是为什么您的比较无法按预期进行的原因

>>> class ClassA(object):
...     pass
... 
>>> class ClassB(object):
...     pass
... 
>>> type(ClassB)
<class 'type'> 
>>> type(ClassA)
<class 'type'> 
>>> type(ClassA) == type(ClassB)
True

但为什么要这样做ClassA and ClassB具有相同类型type?引用docs https://docs.python.org/3/reference/datamodel.html#customizing-class-creation:

默认情况下,类是使用 type() 构造的。班级主体是 在新的命名空间中执行,并且类名本地绑定到 类型的结果(名称、基数、命名空间)。

Example:

>>> ClassB
<class '__main__.ClassB'>
>>> type('ClassB', (), {})
<class '__main__.ClassB'>
>>> type(ClassB)
<class 'type'>
>>> type(type('ClassB', (), {}))
<class 'type'>

获取类型ClassB与获取类型完全相同type('ClassB', (), {}),即type.

解决方案

直接比较它们(不使用type()功能):

>>> ClassA
<class '__main__.ClassA'>
>>> ClassB
<class '__main__.ClassB'>
>>> ClassA == ClassB
False

或初始化它们并比较它们对象的类型:

>>> a = ClassA()
>>> b = ClassB()
>>> type(a) 
<class '__main__.ClassA'>
>>> type(b) 
<class '__main__.ClassB'>
>>> type(a) == type(b)
False

FWIW你也可以使用is代替==(对于课程)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何比较Python中的两个类/类型? 的相关文章

随机推荐