我在jupyter notbook中修補一個小專案的想法時,偶然發現了一些奇怪的行為。 下面的代碼是從原文中抽象出來的。
class MyClass:
實體 = []
def __init__(self,name=None)。
self.id = len(MyClass.Instances)
MyClass.Instances.append(self)
if name is None:
self.name = 'Class %s' % self.id.
else:
自身的名字 = 名字
def show(self)。
print('Name: %s
身份證。%s' % (self.name, self.id)
def instance_at(i : int) 。
if i >= len(MyClass.Instances)。
raise ValueError("Instance does not exist"/span>)
return MyClass.Instances[i] 。
(我希望代碼是不言自明的)
我運行了單元格并測驗了代碼,它作業得很好:我運行了單元格并測驗了代碼,它作業得很好。
在 [24] : m = MyClass()
m.show()
輸出 [25] : 名稱。類 0 0
身份。0 0
轉折點:
我不喜歡第一個沒有名字的實體被稱為'Class 0',所以我想:'為什么不添加一個物件,作為索引0的占位符'(不要問我為什么這么做,這是個腦筋急轉彎)。
所以我把第2行改成了Instances = [MyClass(name='id')。這也起作用了,但是當我試圖接收索引為0的實體時,它的id值與我預期的不同。
在 [24] : m = MyClass()
m.show()
MyClass.instance_at(0).show()
Out [25] : Name: 類0。
身份。1 1
名稱。id
id: 1
這時我決定在另一個筆記本上寫一個更通用的代碼版本(這里顯示的代碼)。在運行單元格之前,我寫下了它的全部內容,包括Instances = [MyClass(name='id')]。
這次我得到了這樣的結果:
---------------------------------------------------------------------------
NameError Traceback (最近一次呼叫)
<ipython-input-1-60020e1975a4> in < module>
----> 1 class MyClass。
2 Instances = [MyClass(name='id')]
3 #Instances = []/span>
4
5 def instance_at(i : int) 。
<ipython-input-1-60020e1975a4> inMyClass()
1 class MyClass:
----> 2 Instances = [MyClass(name='id'/span>)]
3 #Instances = []/span>
4
5 def instance_at(i : int) 。
NameError: name 'MyClass' is not defined
所以現在我有一段代碼在一個筆記本中運行,但在另一個筆記本中不運行。至少當你簡單地復制和粘貼它時是這樣。在 jupyter 筆記本中,通過將第 2 行改為 Instances = [],運行單元格并將其改回,可以解決這個問題。
我相當肯定,這是因為在我創建這行模棱兩可的代碼之前,類和類變數Instances已經存在了。
事后看來,這確實是有道理的,我懷疑這個意外的 id 值來自于在創建實體 m 時在串列中發現的建構式呼叫。
我錯了嗎?有誰能詳細說明一下嗎?
請讓我知道
如果這樣的帖子在這里不合適,請告訴我。
uj5u.com熱心網友回復:
一個更簡單的例子:
class Example。
def __init__(self):
print("Creating an instance of the OLD class")
class Example。# 像這樣重新定義不會***導致錯誤。
實體 = [Example()]
def __init__(self):
print("創建一個新類的實體")
# OLD資訊被立即列印出來。
# 因為`Instances = [Example()]`使用了之前的定義。
# 因為它**不能使用當前的定義;它還沒有被創建。
# 你***確實得到了一個錯誤,***不使用舊的定義,因為那時
# 根本就沒有一個定義。
x = Example() # 新資訊被列印出來了。
# 舊的類**仍然存在,但不能輕易地被訪問。
# 只要我們能想到一個方法來獲取一個實體,就可以了。
# 我們可以使用實體的`__class__`來創建更多的;
#并且我們可以重命名,使其易于使用:
Old_Example = Example.Instances[0].__class__。
y = Old_Example()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313113.html
標籤:
