Python类赋值造成混乱

2022-05-21 08:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

看下面的例子

>>> 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? 他们都是同一类人,不是吗


Tags: 代码falsetrueismaintypepassbethisclass例子shouldn
2条回答
网友
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'
网友
2楼 ·

根据docs:'。。。对于三个参数,返回一个新类型对象'

>>> X1 = type('X', (), {})
>>> Y1 = type('X', (), {})
>>> id(X1) == id(Y1)
False

鉴于第一个例子Y‘参考’X:

>>> class X:
...     pass
... 
>>> Y = X
>>> id(X) == id(Y)
True