我在模块中定义了两个类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(使用前将#替换为@)