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

标签 python types

我在模块 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

但是为什么ClassAClassBtype类型相同呢?引用 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/

相关文章:

c - 如何使用 C99 标准类型在大多数平台上实现最大的可移植性和效率?

javascript - TypeScript 错误 '(response) => void' 类型的参数不可分配给 '(value: void) => void | PromiseLike<void>' 类型的参数

Haskell - 将列表转换为带有索引的对象列表

python - 计算列表中唯一字符串的数量? python 3

python - 如何跳过标准输入的第一行读取?

python - 如何转换大型数据框

scala - 允许方法签名中存在子类型的特征

python - 实践中的最小二乘法

python - 使用 PyInstaller 编译 python 会抛出许多警告

delphi - 如何获取枚举类型