我使用通過 pip 引入的外部 pacakge。
這個包的結構如下:
class OuterThing:
field: Innerthing
def outer_method1(self...
class InnerThing():
def inner_method1(self,...
def inner_method2(self,...
def inner_method3(self,...
我只實體化OuterThing物件(然后在內部實體化InnerThing物件)。
我希望內部事物物件具有所有正常的欄位和方法,只是inner_method1我需要自定義一些以供我使用。
執行此操作的最短方式(即代碼最少的方式)是什么?
如果可能的話,我不想將整個包復制到我的源代碼樹中,只需在運行時(但可能在所有實體化之前)將更改“注入”到InnerThing.
uj5u.com熱心網友回復:
在 Python 中,方法只是類物件的一個??屬性,它恰好是一個具有self作為其第一個引數的函式。這意味著你可以很容易地用你自己的函式替換它,只要你保持相同的簽名。您甚至可以從自己的方法中呼叫原始方法:
# after having imported InnerThing
_orig_inner_method1 = InnerThing.inner_method1
def _patched_inner_method1(self, ...):
# your own code
...
_orig_inner_metho1(self, ...) # eventually call the original method
...
InnerThing.inner_method1 = _patched_inner_method1
從那時起,InnerThing創建的任何物件都將使用您的修補方法。
uj5u.com熱心網友回復:
Python 允許您通過將不同的函式指標分配給您嘗試替換的函式來簡單地修補代碼。只要您可以InnerThing在運行時獲取對 的實體的參考,就可以做到這一點。
在您的情況下,似乎OuterThing確實有參考,InnerThing因此您可以執行以下操作:
def your_implementation_of_inner_method1(self, ...):
# Do stuff
outerThing = OuterThing()
outerThing.field.inner_method1 = your_implementation_of_inner_method1
如果您想更深入地了解為什么會這樣,我建議您查看Python 檔案中的 classes。tl;dr 是方法實際上是物件,并且作為欄位存盤在類的實體中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/452235.html
上一篇:具有多個引數的C 類模板
