[英]Class name as a variable in python
我只是在這里看一個問題,OP正在為類,其他東西以及變量使用相同的名稱。 當我試圖回答它時,我自己變得困惑,因此想到了問。
例如:
class MyClass:
pass
MyClass=MyClass()
雖然,我永遠不會編碼這樣的東西。 我想了解python解釋器將如何處理它。 所以我的問題是,我將使用的變量MyClass將首先創建還是以其他方式創建? 也就是說,首先創建一個MyClass實例並將其分配給MyClass變量。 我認為后者是正確的,但如果是這樣的話,將如何解決以下問題?
class MyClass:
pass
MyClass=MyClass()
new_class=MyClass()
首先處理賦值的右側,因此創建了MyClass
的實例。 但是,您將名稱MyClass
重新分配給該實例。 當你執行
new_class = MyClass()
你應該得到一個關於MyClass
不可調用的錯誤,因為該名稱現在指的是原始類的實例,而不是類本身。
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
>>>
這條線:
new_class=MyClass()
在大多數情況下會返回一個錯誤,說像實例不可調用。
MyClass
現在指的是MyClass
之前持有的類的實例。
您可以通過以下方式創建以前的 MyClass
的新實例:
new_class = MyClass.__class__()
MyClass
只是一個指向/引用特定對象的變量。 首先它是類,然后它被更改為持有class
的實例。
變量在Python中被視為對象。 根據我的理解,當您將一個新的MyClass實例分配給一個對象時,python將嘗試為該對象創建一個原始類的引用並復制。 但是,新對象的命名空間已經被使用(在原始的MyClass中),並且復制將返回錯誤,因此第一個代碼將不起作用。
對於第二段代碼,由於名稱空間復制的相同原因,最后一行不會執行。 由於最后一行但是失敗了,建議的參考目標仍然是原始的MyClass,它根本不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.