我正在学习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工作正常。
调用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,但为什么参数不匹配
请解释组织此课程和函数调用的pythonic方法。
答案 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
(其中self
为s
)添加到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点。
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。
AttributeError:&#39;排序&#39;对象没有属性&#39; func&#39;
有人可以确认我的发现吗?