请看以下示例。
>>> class X:
pass
>>> Y = X
>>> X
<class '__main__.X'>
>>> Y
<class '__main__.X'>
>>> Y == X
True
>>> Y is X
True
以上代码是可以理解的。但是,请看下面的一个。
>>> X = type('X', (), {})
>>> Y = type('X', (), {})
>>> X
<class '__main__.X'>
>>> Y
<class '__main__.X'>
>>> X == Y # Shouldn't this be True??
False
>>> X is Y
False
此处X is Y == False
符合预期。但是X == Y
是False
怎么回事?
它们都属于同一类型,不是吗?
答案 0 :(得分:1)
根据docs:'...有三个参数,返回一个新的类型对象'。
>>> X1 = type('X', (), {})
>>> Y1 = type('X', (), {})
>>> id(X1) == id(Y1)
False
而第一个例子Y'引用'X:
>>> class X:
... pass
...
>>> Y = X
>>> id(X) == id(Y)
True
答案 1 :(得分:1)
当您使用class
语句时,会发生两件事。首先,使用您指定的名称创建一个类。也就是说,该类具有__name__
属性,该字符串作为其值。其次,该类被赋予该名称作为变量。
>>> class X:
pass
>>> X.__name__
'X'
>>> Y = X
>>> Y.__name__
'X'
当您打印课程时,它会显示__name__
值:
>>> X
<class '__main__.X'>
>>> Y
<class '__main__.X'>
正如您在将X指定给Y时所看到的那样,变量的名称和类的名称可能不同。
使用type
创建类时,每次都会创建一个新的不同类。您可以使用两个具有相同__name__
的类,每个类分配给不同的变量。这就是你在这里所做的:
>>> X = type('X', (), {})
>>> Y = type('X', (), {})
>>> X
<class '__main__.X'>
>>> Y
<class '__main__.X'>
>>> X.__name__
'X'
>>> Y.__name__
'X'