一個類的實例可以知道,如果它被用來作爲一個參數,它是否是一個位置或關鍵字參數,如果位置,它的哪個位置的,如果關鍵詞,其關鍵字會被分配給了,下面這一切,它可以根據這些知識解決/返回/替換其他的東西,例如它的一個實例屬性,所以調用將其作爲參數而不是類實例本身?類實例是否可以知道它是否是一個參數?
我意識到我的課堂問題越來越瘋狂。感謝你對我謙遜。
一個類的實例可以知道,如果它被用來作爲一個參數,它是否是一個位置或關鍵字參數,如果位置,它的哪個位置的,如果關鍵詞,其關鍵字會被分配給了,下面這一切,它可以根據這些知識解決/返回/替換其他的東西,例如它的一個實例屬性,所以調用將其作爲參數而不是類實例本身?類實例是否可以知道它是否是一個參數?
我意識到我的課堂問題越來越瘋狂。感謝你對我謙遜。
不 - 這些都不可能。
冥思苦想你怎麼可能去接近 - 你可以定義循環通過參數的函數,並且告訴了參數此信息的裝飾。
def toldargs(f):
def wrapper(*args, **kargs):
for i, arg in enumerate(args):
arg.you_are_arg_number(i)
for k in kargs:
kargs[k].you_are_karg_named(k)
return f(*args, **kargs)
return wrapper
@toldargs
def myfunction(a, b):
...
(未編譯/未測試)。
這是怎麼回事,如果你使用它上通常被稱爲功能顯著影響性能。而且在調用這些方法之前,您可能需要嘗試/ catch或實例測試,以避免錯誤的參數不期望這樣的調用。
更新 - 思維多一些,你(可能)不真正關心的東西時,傳遞給函數有關,但什麼情況下是當您的實例一些操作被調用(如果ARG傳遞給一個函數,但從來沒有用過,那麼它並不重要,無論如何我都能想到)。
換句話說:
def some_function(a, b):
# here you can't trigger anything
...
a.foo() # but here you can
時.foo()
是叫你可以檢查你的背景。有各種方法 - 最明顯/最粗糙的是拋出異常,捕捉它並檢查調用堆棧。但您也可以使用所有工具here。因此,例如,您可以檢查當前的堆棧以查看是否在特定的類中被調用。
又來了,這很可能將是緩慢而複雜......
更新2 - 看到Python: Modifying passed arguments before class instance initialization爲基於元類的方法。
謝謝,安德魯。這裏棘手的一點是,我的實例可以使用的函數不是我寫的,不能被我修改。我的類實例是一個層次結構,但很容易被認爲是一個單一的概念。我想要自由地隨處使用實例的名稱,大部分事情不會被我簡單地接收到,就像Python中的任何函數一樣,但我知道的很少的東西,它們需要層次結構的一些子部分,我希望它能夠智能地提供正確的子部分。當然,我可以指定子部分,但不必須。 –
我並不真正關注細節,但這讓我想到了另一種可能的解決方案 - 請參閱上面的更新。 –
是的,我一直在想我是否可以做一些檢查。這絕對是跨越瘋狂代碼的領域,我不想訪問這個世界,但看到什麼是可能的仍然很有趣,而且我總是通過這些探索學到很多關於Python的核心。謝謝你的幫助,安德魯。 –
號可以,但是,實施方法,以自動地將類轉換爲相應的上下文中的其它值(整數或字符串例如)。 –
瘋狂的問題可能是一個瘋狂的設計的暗示... – teukkam
當然。謝謝,teukkam。 –