我在模块中定义了两个类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)
但为什么ClassA与ClassB具有相同类型的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代替==(用于课程).
如果要检查类型是否相等,则应使用isoperator。
示例:我们可以创建下一个愚蠢的元类
class StupidMetaClass(type):
def __eq__(self, other):
return False
Run Code Online (Sandbox Code Playgroud)
然后基于它进行分类:
在 Python 2 中
class StupidClass(object):
__metaclass__ = StupidMetaClass
Run Code Online (Sandbox Code Playgroud)
在 Python 3 中
class StupidClass(object):
__metaclass__ = StupidMetaClass
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操作符的行为。