我只是在这里看一个问题,OP正在为类,其他东西以及变量使用相同的名称。当我试图回答它时,我自己变得困惑,因此想到了问。
例如:
class MyClass:
pass
MyClass=MyClass()
虽然,我永远不会编码这样的东西。我想了解python解释器将如何处理它。所以我的问题是,我将使用的变量MyClass将首先创建还是以其他方式创建?也就是说,首先创建一个MyClass实例并将其分配给MyClass变量。我认为后者是正确的,但如果是这样的话,将如何解决以下问题?
class MyClass:
pass
MyClass=MyClass()
new_class=MyClass()
答案 0 :(得分:4)
首先处理赋值的右侧,因此创建了MyClass
的实例。但是,您将名称MyClass
重新分配给该实例。执行时
new_class = MyClass()
你应该得到关于MyClass
不可调用的错误,因为该名称现在指的是原始类的实例,而不是类本身。
答案 1 :(得分:3)
class MyClass:
pass
MyClass=MyClass()
简单来说,上面的代码做了三件事(按此顺序):
定义班级MyClass
。
创建MyClass
。
将该实例分配给变量MyClass
。
在最后一步之后,类MyClass
被覆盖,无法再使用。您剩下的就是变量MyClass
中包含的实例。
此外,如果您尝试像调用类一样调用此实例,则会出现错误:
>>> class MyClass:
... pass
...
>>> MyClass=MyClass()
>>> new_class=MyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'MyClass' object is not callable
>>>
答案 2 :(得分:2)
该行:
new_class=MyClass()
在大多数情况下会返回错误,说像实例不可调用。
MyClass
现在指的是MyClass
之前持有的类的实例。
您可以通过以下方式创建前 MyClass
的新实例。
new_class = MyClass.__class__()
MyClass
只是一个指向/引用特定对象的变量。首先它是类,然后它被更改为保存class
的实例。
答案 3 :(得分:-1)
变量在Python中被视为对象。根据我的理解,当您将一个新的MyClass实例分配给一个对象时,python将尝试为该对象创建一个原始类的引用并复制。但是,新对象的命名空间已经被使用(在原始的MyClass中),并且复制将返回错误,因此第一个代码将不起作用。
对于第二段代码,由于名称空间复制的相同原因,最后一行不会执行。由于最后一行失败,建议的参考目标仍然是原始的MyClass,根本不起作用。