簡體   English   中英

類名作為python中的變量

[英]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()

簡單來說,上面的代碼做了三件事(按此順序):

  1. 定義類MyClass

  2. 創建MyClass的實例。

  3. 將該實例分配給變量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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM