1

我是 Python OOP 的新手。请不要苛刻。这是我的代码,它从列表中计算出运动员的最快时间并显示出来。但是在运行时,我收到此错误:

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()
4

2 回答 2

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

这就是selffor 作为在同一对象上查找实例属性和其他方法的参考点。

您可能希望重命名 list为不影响内置类型的名称。

于 2013-02-25T16:20:28.333 回答
1

Martijn 已经回答了你的问题,所以这里有一些备注和代码风格提示:

  1. 新式类派生自object
  2. 您同时拥有运动员姓名和他们的时间,它们作为字典中的键值对一起属于,而不是两个单独的列表
  3. 不要print在类方法中使用语句,类方法应该返回一个可以打印的对象
  4. 如果您有超过 2 名运动员想要输入时间怎么办?如果将运动员的数量作为函数的参数,则可以添加可变数量的运动员
  5. 给出描述性变量名(not mylist)并且不要使用内置函数的名称(如list)作为变量名
  6. 您想在整个类中使用的变量可以在__init__方法中初始化。
  7. 对于打印,请使用该format功能而不是使用逗号
  8. 使用if __name__ == '__main__',以便您的 Python 文件可以充当可重用模块或独立程序

考虑到这些,我会将您的代码重写为以下内容:

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])
于 2013-02-25T17:09:56.953 回答