我在模块 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
和ClassB
的type
类型相同呢?引用 docs :
By default, classes are constructed using type(). The class body is executed in a new namespace and the class name is bound locally to the result of type(name, bases, namespace).
例子:
>>> 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
代替 ==
(对于类)。
关于python - 如何比较 python 中的两个类/类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23012178/