我在 python3 中創建類和物件的程序中發現了一些奇怪的行為。
如果我的類非常簡單,我不喜歡在撰寫類期間每次鍵入“self”單詞和建構式,所以我創建了類“Foo”,它復制靜態變數并將它們轉換為新物件的屬性。
一開始我在制作沒有方法的“Foo”子類,然后一切正常——物件是不同的。但是,在向子類添加方法后,我發現 self 值不知何故指向了錯誤的物件。
這是我制作的代碼:
from copy import deepcopy
class Foo:
def __init__(self):
for i in filter(lambda x: "__" not in x, self.__dir__()):
self.__setattr__(i, deepcopy(self.__getattribute__(i)))
class Bar(Foo):
val = []
def func(self):
print("Self ID:", id(self))
print(self.val)
obj = Bar()
obj.val.append(2)
print("Object ID:", id(obj))
print(obj.val)
obj.func()
# Prints:
#
# Object ID: 2507794284496
# [2]
# Self ID: 2507794283248
# []
#
# While it should print same ID and [2] in both lists
我確信我在創建 Foo 類的程序中忘記了一些重要的事情,因為如果我洗掉“(Foo)”部分,那么 ID 和串列是相同的。
有人可以解釋我有什么問題嗎?提前感謝您的幫助!<3
uj5u.com熱心網友回復:
您正在檢索一個self.func方法物件,對其進行深度復制,并將結果分配給self.func.
深拷貝創建一個系結到新Bar實體的方法物件,該實體將擁有在復制方法之前創建的任何實體屬性的自己的副本,并且在復制方法之后將創建的任何實體屬性都沒有實體屬性。無論哪種方式,它都是具有錯誤屬性的錯誤實體。
uj5u.com熱心網友回復:
我禁用了復制方法,它現在似乎作業了。這是代碼:
from copy import deepcopy
class Foo:
def __init__(self):
for i in filter(lambda x: "__" not in x, self.__dir__()):
attr = self.__getattribute__(i)
if attr.__class__.__name__ != 'method':
self.__setattr__(i, deepcopy(attr))
class Bar(Foo):
val = []
def func(self):
print("Self ID:", id(self))
print(self.val)
obj = Bar()
obj.val.append(2)
print("Object ID:", id(obj))
print(obj.val)
obj.func()
# Object ID: 2785572945632
# [2]
# Self ID: 2785572945632
# [2]
我沒有看到任何需要復制該方法的用例,所以這對我來說真的不是問題。
非常感謝@user2357112 向我解釋了什么不起作用<3
uj5u.com熱心網友回復:
嘗試這個
class Bar(Foo):
def __init__(self):
super().__init__(self)
self.val = []
def func(self):
print("Self ID:", id(self))
print(self.val)
它應該有效嗎?
Object ID: 140516181578944
[2]
Self ID: 140516181578944
[2]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532109.html
上一篇:基類和繼承類名稱/前綴
