我在模块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的本机类型值比较类类型?
答案 0 :(得分:9)
这就是为什么你的比较没有按预期工作的原因
>>> 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:
默认情况下,使用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
然后基于它的类:
class StupidClass(object):
__metaclass__ = StupidMetaClass
class StupidClass(metaclass=StupidMetaClass):
pass
然后简单检查
StupidClass == StupidClass
返回False
,而下一次检查会返回预期的True
值
StupidClass is StupidClass
因为我们可以看到==
运算符可以被覆盖,而没有简单的方法可以更改is
运算符的行为。
答案 3 :(得分:1)
除了其他答案:
Python使用元类的概念,它基本上是&#34;类的类&#34;。这意味着,即使是Class也是Python中的一个对象,它有自己的类 - 可以使用type
in-build函数进行访问。
因为ClassA
和ClassB
默认是同一元类的实例,所以比较返回True。
如果您想了解有关元类的更多信息,this SO post是一个良好的开端。