TypeError:' list' object不可调用,错误调用从继承的列表类扩展

时间:2017-03-19 04:12:44

标签: python inheritance

我写了以下代码,

    #sanitize fuction
def sanitize(time_string):
   if '-' in time_string:
      splitter = '-'
   elif ':' in time_string:
      splitter = ':'
   else:
      return(time_string)
   (mins, secs) = time_string.split(splitter)
   return(mins + '.' + secs)

class AthleteList(list):
   def __init__(self, a_name, a_dob=None, a_times=[]):
      list.__init__([])
      self.name = a_name
      self.dob = a_dob
      self.extend = a_times
   def top3(self):
      return(sorted(set([sanitize(t) for t in self]))[0:3])

#get coach data fuction
def get_coach_data(filename):
   try:
      with open(filename) as f:
         data = f.readline()
         templ = data.strip().split(',')
         return(AthleteList(templ.pop(0), templ.pop(0), templ))
   except IOError as ioerr:
      print('File error: ' + str(ioerr))
      return(None)

sarah = get_coach_data("sarah2.txt")
julie = get_coach_data("julie2.txt")
james = get_coach_data("james2.txt")
mikey= get_coach_data("mikey2.txt")

vera = AthleteList('vera')
vera.append('1.33')
vera.extend(['1.74','1.46','1.42','1.40'])
print(vera.top3())

运行此代码时,会显示以下错误。 但是当我使用extend方法时它只显示错误。   我可以使用没有probs的append方法。

  

vera.extend([&#39; 1.74&#39;&#39; 1.46&#39;&#39; 1.42&#39;&#39; 1.40&#39;])< / p>      

    

TypeError:&#39; list&#39;对象不可调用

  

4 个答案:

答案 0 :(得分:1)

要访问列表,您需要使用方括号([])而不是括号(())。

而不是

vera.extend(['1.74','1.46','1.42','1.40'])

使用

  aList = ['1.74','1.46','1.42','1.40']
   vera.extend(aList)

答案 1 :(得分:1)

遵循AthleteList('vera')的执行路径,注意self.extend如何初始化为列表,这会影响您期望的功能。

发生的事情基本上是这样的:

>>> extend = []
>>> extend(['foo'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

答案 2 :(得分:0)

您基本上是在尝试调用列表(self.extend = a_timesa_times = []),这是不可能的。

您需要做的是:

vera.extend.extend(['1.74','1.46','1.42','1.40'])

或者这个(如前所述):

vera.extend = ['1.74','1.46','1.42','1.40']

但实际上这也不完全正确(假设我们需要vera列表而不是vera.extend一个[在首次发布时错过了这个,抱歉!]),如下所示:

>>> vera = AthleteList("vera")
>>> vera.extend = ['1.74','1.46','1.42','1.40']
>>> print(vera.top3())
[]
>>> vera.extend.extend(['1.74','1.46','1.42','1.40'])
>>> print(vera.top3())
[]

正确的答案是从AthleteList类中移除self.extend,使其按您希望的方式工作(vera.extend(['1.74','1.46','1.42','1.40']))。

>>> vera = AthleteList("vera")
>>> vera.extend(['1.74','1.46','1.42','1.40'])
>>> print(vera.top3())
['1.40', '1.42', '1.46']

所以,上课应该是这样的:

class AthleteList(list):
   def __init__(self, a_name, a_dob=None, a_times=[]):
      list.__init__([])
      self.name = a_name
      self.dob = a_dob
   def top3(self):
      return(sorted(set([sanitize(t) for t in self]))[0:3])

希望它有所帮助!

答案 3 :(得分:0)

根据你的代码,你已经将一个类变量扩展为一个empt列表。

self.extend = a_times

其中a_times = []

根据您的代码,它是变量不是函数。这就是为什么它会抛出' not callable '

的错误

更改以下代码行:

vera.extend(['1.74','1.46','1.42','1.40'])vera.extend = ['1.74','1.46','1.42','1.40']

希望它有所帮助!