比较python中的两种类类型

2024-05-12 12:41:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在模块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的本机类型值比较类类型?


Tags: 模块类型objecttypepassclassclassesprint
3条回答

解释

这就是为什么你的比较没有达到预期的效果

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

但是为什么ClassAClassB具有相同的类型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

解决方案

直接比较它们(w/out使用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代替==(用于类)。

如果要检查类型是否相等,则应使用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运算符的行为。

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

如果只想比较类,请直接比较它们:

print Class3 == Class4

相关问题 更多 >