1

次の出力をエミュレートしようとしています (Marakana.com の優れた Python チュートリアルから:

>>> for c in lot.cars_by_age():
...     print c
1981 VW Vanagon
1988 Buick Regal
2010 Audi R8

これまでの私のコード:

class ParkingLot(object):
    def __init__(self, spaces, cars=[]):
        self.spaces = spaces
        self.cars = cars
    def park(self, car):
        if self.spaces == 0:
            print "The lot is full."
        else:
            self.spaces -= 1
            self.cars.append(car)
    def __iter__(self):
        return (car for car in self.cars)

class Car(object):
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
    def __str__(self):
        return '%s %s %s' % (car.year, car.make, car.model)

メソッド (cars_by_age()) を ParkingLot() クラスに追加したいと考えています。ただし、サンプル コードのように、このメソッドは反復可能である必要があります。これを行う方法がわかりません-クラスの場合はiter関数を定義しますが、メソッドの場合はどのようにしますか?

4

2 に答える 2

7

メソッドが反復可能であるというわけではありません。メソッドによって返される値は反復可能です。実装は単にの cars_by_ageリストを返すことができますCar

def cars_by_age(self):
    return sorted(self.cars, key=lambda car: car.year)

sorted新しいソート済みリストを作成するために使用しlambda、車のyear属性でソートすることを指定するために使用します。

http://wiki.python.org/moin/HowTo/Sorting

于 2012-05-24T17:16:45.373 に答える
0
from operator import attrgetter

class ParkingLot(object):
    def __init__(self, spaces, cars=None):
        self.spaces = max(spaces, 0)
        self.cars = cars or []
    def park(self, car):
        if self.spaces > 0:
            self.spaces -= 1
            self.cars.append(car)
        else:
            print "The lot is full."
    def __iter__(self):
        return iter(self.cars)
    def cars_by_age(self):
        return sorted(self.cars, key=attrgetter("year"), reverse=True)

class Car(object):
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
    def __str__(self):
        return "{} {} {}".format(self.year, self.make, self.model)
于 2012-05-24T22:46:57.303 に答える