2013-03-18 52 views
1

問題:蟒蛇 - 如何重載方法得到加載

  1. 是否蟒蛇加載方法的方式 - 誰是最後誰贏了?即使你有兩個方法共享確切的名字,即使有不同的參數(不同的簽名),最後一個將會否決所有以前的方法,而不會給出運行時錯誤?
  2. 如果python沒有重載,python推薦的重載方式如JAVA是什麼?

下面的例子:

class Base(object): 
    def __init__(self): 
     print "Base created without args" 
    def __init__(self, a): 
     print "Base created " + a + "\n" 

print Base("test")給我:

Base created test 

<__main__.Base object at 0x1090fff10> 

雖然print Base()給我:

Traceback (most recent call last): 
File "${path to super file}/super.py", line 27, in <module> 
print Base() 
TypeError: __init__() takes exactly 2 arguments (1 given) 
+0

可能重複的[在Python中重載方法](http://stackoverflow.com/questions/9725968/method-overloading-in-python) – oefe 2013-03-18 20:25:37

回答

4
  1. 基本上,你ALRE艾迪自己回答了這個問題。 Python不關心方法簽名,只有名字是重要的。這也適用於模塊級功能。
  2. 與Java,Python允許您指定方法參數的默認值(這在我看來是更爲方便):

    class Base(object): 
        def __init__(self, a=None): 
         if a is None: 
          print "Base created without args." 
         else: 
          print "Base created with %s" % a 
    
    a = Base() # prints "Base created without args." 
    b = Base(123) # prints "Base created with 123." 
    
+0

此外,在大多數其他場景中,鴨式輸入消除了方法重載的需要。 – 2013-03-18 20:34:08

0

你可以滾你自己的方法使用裝飾overloader:

class OverloadFunction(object): 

    def __new__(cls, f): 
     self = object.__new__(cls) 
     setattr(self, "_dct", {}) 
     return self.overload(())(f) 

    def overload(self, signature): 
     def wrapper(f): 
      self._dct[signature] = f 
      return self 
     return wrapper 

    def __call__(self, *args, **kwargs): 
     return self._dct[self._get_signature(args)](*args, **kwargs) 

    def _get_signature(self, obj): 
     return tuple(type(x) for x in obj) 


@OverloadFunction 
def hello(): 
    print "hello, no args" 

@hello.overload((int,)) 
def hello(i): 
    print "hello with an int argument:", i 

@OverloadFunction 
def add(): pass 

@add.overload((int, int)) 
def add(a, b): 
    print "integer addition, %d + %d = %d" % (a, b, a + b) 

@add.overload((str, int)) 
def add(a, b): 
    print "string concatentation, %r + %d = %r" % (a, b, a + str(b)) 

hello() 
hello(1) 
add(2, 3) 
add("a", 3) 

,輸出:

hello, no args 
hello with an int argument: 1 
integer addition, 2 + 3 = 5 
string concatentation, 'a' + 3 = 'a3' 
+0

儘管如[helmbert說](http://stackoverflow.com/a/15486148/1142167),你應該使用默認參數。 – 2013-03-18 21:01:19