Python类分配造成混乱

时间:2017-04-23 10:15:52

标签: python class

请看以下示例。

>>> 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 == YFalse怎么回事? 它们都属于同一类型,不是吗?

2 个答案:

答案 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'