比较python中的两个类类型

E.B*_*ach 8 python types

我在模块中定义了两个类classes.py:

class ClassA(object):
    pass

class ClassB(object):
    pass
Run Code Online (Sandbox Code Playgroud)

在另一个模块中,我得到了模块的属性:

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)
Run Code Online (Sandbox Code Playgroud)

两种类型比较都返回True,这不是我所期待的.

如何使用python的本机类型值比较类类型?

vau*_*tah 10

说明

这就是您的比较无法按预期工作的原因

>>> class ClassA(object):
...     pass
... 
>>> class ClassB(object):
...     pass
... 
>>> type(ClassB)
<class 'type'> 
>>> type(ClassA)
<class 'type'> 
>>> type(ClassA) == type(ClassB)
True
Run Code Online (Sandbox Code Playgroud)

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

默认情况下,使用type()构造类.类主体在新的命名空间中执行,类名在本地绑定到类型(name,bases,namespace)的结果.

例:

>>> ClassB
<class '__main__.ClassB'>
>>> type('ClassB', (), {})
<class '__main__.ClassB'>
>>> type(ClassB)
<class 'type'>
>>> type(type('ClassB', (), {}))
<class 'type'>
Run Code Online (Sandbox Code Playgroud)

获取类型与获取类型ClassB完全相同type('ClassB', (), {}),即type.

解决方案

直接比较它们(没有使用该type()功能):

>>> ClassA
<class '__main__.ClassA'>
>>> ClassB
<class '__main__.ClassB'>
>>> ClassA == ClassB
False
Run Code Online (Sandbox Code Playgroud)

或者初始化它们并比较它们的对象类型:

>>> a = ClassA()
>>> b = ClassB()
>>> type(a) 
<class '__main__.ClassA'>
>>> type(b) 
<class '__main__.ClassB'>
>>> type(a) == type(b)
False
Run Code Online (Sandbox Code Playgroud)

FWIW你也可以is代替==(用于课程).


Aza*_*kov 5

如果要检查类型是否相等,则应使用isoperator

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

class StupidMetaClass(type):
    def __eq__(self, other):
        return False
Run Code Online (Sandbox Code Playgroud)

然后基于它进行分类:

然后是一个简单的检查

class StupidClass(metaclass=StupidMetaClass):
     pass

Run Code Online (Sandbox Code Playgroud)

返回False,而

>>> StupidClass == StupidClass
Run Code Online (Sandbox Code Playgroud)

返回一个期望值True

所以我们可以看到==操作符可以被覆盖,而没有办法(至少是简单的)改变is操作符的行为。