1

我的問題的簡化版本:我想在python中編寫一個方法,它接受一個參數,一個字符串列表或一個包含字符串列表的自定義對象。然後返回列表的大小。該方法是專門爲用戶調用,所以我希望它對用戶來說很簡單(基本上我不希望兩個方法做同樣的事情,除了一行代碼,我不想導入非python標準庫)Python中的重載方法(解決方法)

我認識到重載是不可能的在Python中就像它是在Java中。

什麼是一個很好的方式去這個/什麼是標準的方式?我想到的解決方案是:

寫出兩種不同的方法。 用兩個參數和默認值編寫一個方法,檢查默認值是否相應移動。 用一個參數寫一個方法,檢查傳入什麼樣的對象,相應地移動(不完全確定是否可以進行此類型檢查)

從設計的角度來看,如果要處理的每種對象類型的語句從長遠來看似乎不是很好,但我沒有看到任何其他解決方案(除了單獨的方法)

謝謝你的建議!

+3

您可以創建不同的對象和實施['__len__'](https://stackoverflow.com/questions/ 2481421/difference-between-len-and-len)以你想要的方式在他們中的每一箇中。 – alfasin

+0

同意@alfasin,如果你可以依賴['duck typing'](https://en.wikipedia.org/wiki/Duck_typing),通常不需要重載。只需在你的課堂上實現'__len__',然後你傳入哪一種類型並不重要。 – AChampion

回答

2

在python中,您使用single dispatch函數根據參數類型(具體而言,根據第一個參數的類型)使用不同實現建立單個方法。

from functools import singledispatch 

@singledispatch 
def process_str_list(str_list): 
    raise NotImplementedError 

@process_str_list.register(list) 
def _(str_list): 
    # process raw list of strings 

@process_str_list.register(MyStrListClass) 
def _(str_list) 
    # process my object 

要調用的函數,只需撥打process_str_list與您的原始列表或對象。類型確定和實現複用發生在內部。

編輯:只是想補充一點,PEP that introduced single dispatch說:

目前,它是Python代碼檢查類型的接收參數,以決定如何處理的對象做一個共同的反模式。

單派遣是接近該行爲的pythonic方式。

+1

我會說'duck typing'是對付這種行爲的pythonic方式。 '@ singledispatch'只在'3.4'中添加。 – AChampion

0

正如alfasin建議,您可以爲您的對象實現__len__函數;

class A(object): 
    def __init__(self, mylist): 
     self.mylist = mylist 
    def __len__(self): 
     return len(self.mylist) 

對於更復雜的區別,你可以在函數級別isinstance

def myfunction(obj): 
    if isinstance(obj, list): 
     # when the object is a list 
    elif isinstance(obj, MyClass): 
     # when the object is something else 
    else: 
     raise ValueError('wrong type!')