2013-02-25 209 views
1

是新来的Python OOP。请不要苛刻。这里是我的代码,它从列表中计算出运动员的最快时间并显示它们。但在运行时,我得到这个错误:全局名称在Python未定义

z= add.mylist.min() 
NameError: global name 'add' is not defined 

我的代码:

class Athlete: 

    def add(self): 
     list=[] 
     mylist=[] 

     for i in range(2): 

      self.name = raw_input("Enter name: ") 
      self.fastest_time = input("time: ") 
      list.append(self.name) 
      mylist.append(self.fastest_time) 
     print "Names: ",list 
     print "Fastest times: ",mylist 

    def display(self): 
     z= add.mylist.min() 
     w= add.mylist.index(z) 
     print "Minimum time: ",z 
     print "Name of athelte with fastest time: ",list[w] 

x = Athlete() 
x.add() 
x.display() 

回答

3

您需要参考方法上的实例与self参数。此外,您add()方法需要回报mylist变量它产生,你不能引用方法的局部变量作为属性的方法:

def display(self): 
    mylist = self.add() 
    z = min(mylist) 
    w = mylist.index(z) 

def add(self): 
    list=[] 
    mylist=[] 

    for i in range(2): 

     self.name = raw_input("Enter name: ") 
     self.fastest_time = input("time: ") 
     list.append(self.name) 
     mylist.append(self.fastest_time) 
    print "Names: ",list 
    print "Fastest times: ",mylist 

    return mylist 

这就是self,作为参考点在同一个对象上找到实例属性和其他方法。

您可能希望将重命名为list以避免影响内置类型。

+0

我想你的代码,这是什么让: Z = self.add.mylist.min() AttributeError的:“功能”对象有没有属性“MYLIST” – 2013-02-25 16:24:07

+0

在显示方法中,我将如何根据列表中的最短时间列出最快的运动员。谢谢 – 2013-02-25 16:31:28

+0

现在得到: z = min(list) TypeError:'type'对象不可迭代 – 2013-02-25 16:36:34

1

的Martijn已经回答了你的问题,所以这里有一些言论和代码风格技巧:

  1. 新式的类从object
  2. 你既有运动员的名字和他们的时间推导,那些属于一起作为字典中的键值对,而不是两个单独的列表
  3. 不要使用类的方法里面print语句,一类方法应该返回一个对象,你那么可以打印
  4. 如果你有更多的日你想输入时间的2名运动员?如果你做运动员的函数的参数个数,你可以添加一个可变数目athlethes的
  5. 给描述性的变量名(不mylist),不使用的内置函数的名称(如list)作为变量名
  6. 您希望在整个班级中使用的变量可以通过__init__方法初始化。
  7. 进行打印,使用format功能,而不是使用逗号
  8. 使用if __name__ == '__main__',使your Python file can act as either reusable modules or as standalone program

考虑到这些,我想你的代码改写为这样的:

from collections import defaultdict 

class Athlete(object): # see (1) 
    def __init__(self): # see (6) 
     self.athlete_times = defaultdict(str) # see (2) 

    def add_athletes_and_times(self, n): # see (4) 
     for i in range(n): 
      self.name = raw_input("Enter name: ") 
      self.fastest_time = input("time (in seconds): ") 
      self.athlete_times[self.fastest_time] = self.name 

    def get_fastest_time(self): 
     return min(self.athlete_times) # see (3) 

if __name__ == '__main__': # see (8) 
    x = Athlete() 
    x.add_athletes_and_times(2) 
    for fast_time in x.athlete_times: 
     print "The fastest time of athlete {0} is {1} seconds.".format(
         x.athlete_times[fast_time], fast_time) # see (7) 
    fastest_time = x.get_fastest_time() 
    print "The overall fastest time is: {0} seconds for athlete {1}.".format(
         fastest_time, x.athlete_times[fastest_time]) 
+0

'defaultdict'在这里是不需要的,一个普通的python'dict'也可以。否则,好的工作清理代码! – 2013-02-25 17:21:23

+0

Woww BIo..Great Help..Atleast我从你Ty学到了一些东西 – 2013-02-25 17:25:03