2015-12-21 143 views
2

我有一個Python類MyClass,方法do_something。我希望這種方法有一個可選參數some_param。到目前爲止,代碼如下所示:具有靜態和非靜態重載的類方法

class MyClass(object): 

    def __init__(self, some_param) 
     self.some_param = some_param 

    def do_something(some_param=None): 
     if some_param: 
      pass 
     else: 
      some_param = self.some_param 

    @staticmethod 
    def do_something_static(some_param): 
     pass 

是有可能有do_something_staticdo_something具有相同的名稱?

換句話說:

如果some_param提供我想do_something是一個靜態方法。

如果沒有提供some_param,那麼它不會是一個靜態方法,因爲它需要訪問self.some_param

MyClass需要同時具備這兩種功能,我希望將它們放在一個函數中,既可以作爲靜態方法也可以作爲非靜態方法調用:是否有可能?


爲什麼?我寧願沒有不同的功能做同樣的事情。 do_something_static確實聽起來像「我不知道如何做得更好」。我問的是,如果可以通過靜態方法訪問self,因爲如果使用替代self的所需參數調用它,我不會那樣做。

+2

不是真的,Python不支持基於簽名的多態/方法重載。 – jonrsharpe

+0

*「是否可以在靜態方法中訪問自己」* - 否,如果您有權訪問'self',則它不是靜態的。你只能有一個給定名稱的方法(除非你做了一些手動的多派遣,例如用一個裝飾器,比如'@ property',即使這樣,我懷疑你會遇到試圖組合靜態和實例方法的問題)。 – jonrsharpe

+0

我明白了,謝謝你的幫助! – Saturnix

回答

4

如果我理解正確,你想有一個函數,如果它作爲一個方法被調用,將從self的屬性中獲取它的參數,否則直接使用它的單個參數。您可以在Python 3中執行此操作,其中未綁定的方法是普通的舊函數(但不在Python 2中,其中未綁定的方法要求其第一個參數爲實例)。

這裏有一個簡單的例子:

class MyClass: 
    def func(arg): 
     if isinstance(arg, MyClass): 
      # if we were called as arg.func(), get the actual arg value from an attribute 
      arg = arg.some_attribute 

     # do something with arg 
     print(arg) 

# MyClass.func can be called like a static method 
MyClass.func("foo") 

# or as a method of an instance of MyClass 
instance = MyClass() 
instance.some_attribute = "bar" 
instance.func() 

現在,我想這不會做你想做的,如果你傳遞給靜態方法的參數可能是類的一個實例(上面會的代碼誤識別爲在實例上調用該方法)。我不認爲有很好的解決方法,不需要很多描述符的工作。

2

爲什麼不使用正常功能:

def do_something(some_param): 
    # do the work 
    pass 

,並在課堂上使用它:

class MyClass(object): 

    def __init__(self, some_param) 
     self.some_param = some_param 

    def do_something(some_param=None): 
     if some_param: 
      do_something(some_param) 
     else: 
      do_something(self.some_param) 

的實施將只在函數內部,但你可以在方法中使用它。似乎是避免重複功能的最簡單的方法。

+0

儘管我發現其他答案更具正則性,但我堅持使用這種方法,因爲我不允許使用Python 3.謝謝! – Saturnix