這是上一個問題的后續,我在這個問題上把事情復雜化了。OOP 中的依賴關系可以通過繼承或組合來強制執行。在這個例子中,我嘗試使用繼承。我想用 OOP 對以下簡單的方程組進行建模:T = c_v*t/(a*h)**2U = (T**3/(T**3+0.5))使用__init__and__call__方法,并且感謝這個鏈接,它展示了一種使用面向對象結構建模數學函數的優雅方式,我能夠做到以下幾點:class T: def __init__(self, c_v, a, h): self.c_v = c_v self.a = a self.h = h def __call__(self, t): return self.c_v*t/(self.a*self.h)**2class U(T): def __call__(self, t): T = super().__call__(t) return (T**3/(T**3+0.5) )**(1/6)然后是以下內容:>>> U_func = U(1.5E-7, 0.5, 12)>>> U_func(100*24*60*60)輸出正確的結果。然而,第 12 行T = super().__call__(t)有點困擾我。我在那里覆蓋類定義T嗎?我真的不想那樣做。另外,我不想在那里為T變量(而不是類)編一個新名稱。是否T僅限于實例方法范圍,還是我實際上覆蓋了類的定義T?
2 回答

肥皂起泡泡
TA貢獻1829條經驗 獲得超6個贊
有兩個不同的變量名為T
:
一個類綁定到
T
當前模塊全局范圍內的名稱。該類的實例綁定到
T
函數本地范圍內的名稱U.__call__
。
它們是完全獨立的,除了在內部__call__
,您必須通過限定名稱來引用該類,例如__name__.T
,因為局部變量T
會隱藏全局變量。

長風秋雁
TA貢獻1757條經驗 獲得超7個贊
我在那里覆蓋類定義
T
嗎?
不。在函數中分配的變量對外部隱藏,在它們自己的私有“范圍”中。您在這里所做的稱為遮蔽全局變量,不推薦但不會覆蓋它。相反,您應該只使用不同的名稱。如果您執行以下操作,該函數只會在全局范圍內分配變量:
def foo(): global bar bar = 'new value'
添加回答
舉報
0/150
提交
取消