這個問題在這里已經有了答案: Python - 從其他內部類參考內部類 1 個回答 昨天關閉。
類似問答的注意事項:
- 這個問題在嵌套 Python 類需要訪問封閉類中的變數中沒有解決,它處理“父”和嵌套“子”類之間的關系,而不是解決
@dataclasses.dataclass類。 - 這個問題在Python-reference internal class from other internal class 中得到解決。我認為那里接受的答案中的代碼有效,但在使用普通類時,在下面的評論后仔細檢查表明它不是。
我正在嘗試@dataclass在另一個類中對多個 Python裝飾類進行簡單的嵌套,并讓后面的類參考回較早的類。如果我根本不嵌套它們,它們會按預期作業,能夠將定義的第一個類包含在第二個類的物件中:
from dataclasses import dataclass, field
@dataclass
class A:
z:int = field(default=0)
@dataclass
class B:
a:A = field(default=A(z=1)) ### Object that is class A is included in class B
b = B(a=A(z=3))
print(f'b = B(a=A(z=3)); b.a.z={b.a.z}; b={b}')
但是,如果我嘗試在另一個類(在這種情況下,不是資料類)內部執行相同的操作,則“B”類無法看到“A”類。在下面的代碼中,a作為一種型別的定義A失敗并出現 NameError:“name Ais not defined”。我試過 A 和 CA,都不行。
請注意,C類中的其他函式能夠看到A和B就好了,只是在資料類B內部看不到資料類A。
class C:
@dataclass
class A:
z:int = field(default=0)
@dataclass
class B:
a:A = field(default=A(z=1)) ### NameError: name 'A' is not defined
def __init__(self):
self.b = C.B(a=C.A(z=3))
def print_info(self):
print(f'b = C.B(a=C.A(z=3)); b.a.z={self.b.a.z}; b={b}')
c = C()
c.print_info()
但是,如果我將這些轉換為普通的 Python 類,它可以在嵌套的情況下作業:
重新檢查,事實證明這在普通課程中也被破壞了(根據下面的評論)。
奇怪的是,如果將資料類 A 嵌套在資料類 B 中,而 B 仍在類 C 中,它確實有效——B 可以直接訪問 A,但類 C 中的其他任何內容都不能直接訪問 A。
題
Is it possible to define nested dataclasses with having the later ones access the earlier ones at the same level? If so, how?
uj5u.com熱心網友回復:
據我所知,這是由于類定義的語意- 強調我的:
然后在新的執行框架中執行類的套件,使用新創建的本地命名空間和原始全域命名空間。(通常,套件主要包含函式定義。)當類的套件完成執行時,它的執行幀將被丟棄,但它的本地命名空間會被保存。
也就是說,任何類定義都只有模塊全域命名空間(C在這種情況下還沒有包含,因為它的套件還沒有完成執行)和一個新的空本地命名空間。
編輯
基于上述,這可以被黑客攻擊一起作業,但我真的不會這樣做......
from dataclasses import dataclass, field
class C:
@dataclass
class A:
z: int = field(default=0)
globals()["A"] = A # "and the original global namespace..."
@dataclass
class B:
a: A = field(default=A(z=1))
def __init__(self):
self.b = C.B(a=C.A(z=3))
def print_info(self):
print(f"{self.b.a.z=}")
c = C()
c.print_info()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336786.html
