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

これが、同じオブジェクトのインスタンス属性やその他のメソッドを見つけるための参照点としてのものselfです。

組み込み型を隠さない名前に変更 することをお勧めします。list

于 2013-02-25T16:20:28.333 に答える
1

Martijn はすでにあなたの質問に答えているので、コメントとコード スタイルのヒントを次に示します。

  1. 新しいスタイルのクラスの派生元object
  2. アスリートの名前とタイムの両方があり、それらは 2 つの個別のリストではなく、キーと値のペアとして辞書にまとめられています
  3. printクラスメソッド内でステートメントを使用しないでください。クラスメソッドは、出力できるオブジェクトを返す必要があります
  4. タイムエントリーしたいアスリートが 2 人以上いる場合はどうすればよいですか? アスリートの数を関数の引数にすると、可変数のアスリートを追加できます
  5. わかりやすい変数名 ( ではなく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 に答える