Python3:将函数名称作为参数传递

时间:2015-11-01 21:18:21

标签: python

我正在学习python oop概念,偶然发现了我正在编写的代码。有一个类Sort,它有不同的排序方法和泛型函数排序。

class Sort:
    def __init__(self, numlist):
        self.numlist = numlist

    def msort(self, beg, end, reverse=False): #merge sort
        if beg < end:
             mid = (beg + end)//2

             self.msort(beg, mid, reverse)
             self.msort(mid+1, end, reverse)
             self.__merge(beg, mid, end, reverse)


    def isort(self, beg, end, reverse=False): #insertion sort
        i = beg #initial index
        for key in numlist[beg+1:end+1]: #from beg+1 to end
            i = i+1 #current index in numlist
            j = i-1
            if reverse:
                while j >= beg and self.numlist[j] < key:
                    self.numlist[j+1] = self.numlist[j]
                    j = j-1
                self.numlist[j+1] = key
            else:
                while j >= beg and self.numlist[j] > key:
                    self.numlist[j+1] = self.numlist[j]
                    j = j-1
                self.numlist[j+1] = key


    def sort(self, beg, end, func=msort, reverse=False):
        print('Calling {0}()'.format(func))
        func(self, beg, end, reverse)

if __name__ == '__main__':
    numlist = [3, 4, 2, 5, 9, 7, 1, 6]
    s = Sort(numlist)
    s.sort(0, len(numlist)-1, func=isort, reverse=False)
    print(s.numlist, end='')

我有以下问题 - 1.在main中,如果我只调用s.sort(0,len(numlist)-1,reverse = False)它正确调用msort并给出结果但是如果我调用s.sort(0,len(numlist) - 1,func = isort,reverse = False)它给出了以下错误 -

  

回溯(最近一次呼叫最后一次):文件&#34; Sort.py&#34;,第76行,in          s.sort(0,len(numlist)-1,func = isort,reverse = False)NameError:name&#39; isort&#39;未定义

我理解为什么它不起作用但不能理解为什么msort工作正常。

  1. 如果我调用s.sort(0,len(numlist)-1,func = s.isort,reverse = False) 然后我得到以下错误 -
  2.   

    调用main.Sort对象   0x031BF830&gt;&gt;()Traceback(最近一次调用最后一次):File&#34; Sort.py&#34;,   第76行,在       s.sort(0,len(numlist)-1,func = s.isort,reverse = False)文件&#34; Sort.py&#34;,第71行,排序       func(self,beg,end,reverse)TypeError:isort()需要3到4个位置参数,但是给出了5个

    无法理解这里发生的事情。我似乎称之为isort,但为什么参数不匹配

    1. 在函数sort()中,我无法调用self.func(),这再次给出了属性错误。使用self是不好的做法。调用其他函数但调用func()而不使用self.func()?
    2. 请解释组织此课程和函数调用的pythonic方法。

4 个答案:

答案 0 :(得分:0)

msort在类定义的范围内得到解析,因此它知道它是Sort.msort

要在定义类之外使用isort,您需要使用Sort.isort

当您传递s.isort时,该方法已绑定到该对象,因此您不得将self作为第一个参数传递。

答案 1 :(得分:0)

您的错误是isort是一个实例方法,这意味着它不存在于Sort类的范围之外。您可以使用Sort.isort

中的main来引用它
s.sort(0, len(numlist)-1, func=Sort.isort, reverse=False)

您遇到第二个错误的原因是s.isort已将self(其中selfs)添加到isort的参数列表中。当您致电func(self, ...)时,您将再次添加self,因此您总共可获得5个参数。

答案 2 :(得分:0)

您应该将func(self, beg, end, reverse)行改为func(beg, end, reverse)。自我论证是自动传递的。我能够使用s.isort。

答案 3 :(得分:0)

感谢您的回复。我很少清楚。我在上面的程序中发现了一个错误,在我使用的isort函数中

  

表示numlist中的键[beg + 1:end + 1]:

其实应该是

  

表示self.numlist中的键[beg + 1:end + 1]:

我将总结下面的调查结果 - 1.如果我在主要中传递func = Sort.isort,则调用func(self,beg,end,reverse)有效 2.调用func(beg,end,reverse)有效如果我在 main

中传递func = s.isort

我完全理解上述2点。

  1. 如果我在 main 中传递func = Sort.isort,则调用func(beg,end,reverse)不起作用。它给了我错误 -
  2.   

    Calling()Traceback(最新的   最后呼叫):文件&#34; Sort.py&#34;,第79行,in       s1.sort(0,len(numlist)-1,func = Sort.isort,reverse = False)文件&#34; Sort.py&#34;,第72行,排序       func(beg,end,reverse)文件&#34; Sort.py&#34;,第55行,在isort中       for self.numlist中的键[beg + 1:end + 1]:#from beg + 1 to end AttributeError:&#39; int&#39;对象没有属性&#39; numlist&#39;

    我猜测自己是不是第一个争论然后默认&#39; int&#39;对象在isort中传递。所以它作为int的问题并没有属性numlist。

    1. 无论我如何在main中传递func,调用self.func(beg,end,reverse)都无法工作。我在主要中尝试了func = Sort.isort和func = s.isort,但每次都出现相同的属性错误
    2.   

      AttributeError:&#39;排序&#39;对象没有属性&#39; func&#39;

      有人可以确认我的发现吗?