比较python中的两个类类型

时间:2014-04-11 12:09:52

标签: 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的本机类型值比较类类型?

4 个答案:

答案 0 :(得分:9)

说明

这就是为什么你的比较没有按预期工作的原因

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

但为什么ClassAClassB具有相同的类型type?引用docs

  

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

示例:

>>> 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代替==(适用于课程)。

答案 1 :(得分:3)

您正在比较类对象的类型,它们都是'type'类型。

如果您只是想比较这些类,请直接比较它们:

print Class3 == Class4

答案 2 :(得分:2)

如果您想检查类型是否相等,那么您应该使用is运算符

示例:我们可以创建下一个愚蠢的元类

class StupidMetaClass(type):
    def __eq__(self, other):
        return False

然后基于它的类:

    Python 2中的
  • class StupidClass(object):
        __metaclass__ = StupidMetaClass
    
  • Python 3中的
  • class StupidClass(metaclass=StupidMetaClass):
        pass
    

然后简单检查

StupidClass == StupidClass

返回False,而下一次检查会返回预期的True

StupidClass is StupidClass

因为我们可以看到==运算符可以被覆盖,而没有简单的方法可以更改is运算符的行为。

答案 3 :(得分:1)

除了其他答案:

Python使用元类的概念,它基本上是&#34;类的类&#34;。这意味着,即使是Class也是Python中的一个对象,它有自己的类 - 可以使用type in-build函数进行访问。

因为ClassAClassB默认是同一元类的实例,所以比较返回True。

如果您想了解有关元类的更多信息,this SO post是一个良好的开端。