2012-05-24 49 views
1

我想下面的輸出(從Marakana.com的excellent Python tutorial效仿: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()類。但是,這種方法需要迭代,根據示例代碼。我不知道如何做到這一點 - 對於一個類,你定義了一個函數,但是你如何做到這一點一種方法?

+2

一句警告:在一般情況下,在Python中,要避免可變對象(如表)作爲默認的參數(如'汽車= []'在你的init方法以上)。關於爲什麼在這裏的全部細節:http://effbot.org/zone/default-values.htm。 – Karmel

回答

7

這不是方法是可迭代的;值通過該方法返回是可迭代的。一個cars_by_age實現可以簡單地返回一個列表Car s。

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

使用sorted創建一個新的排序列表,並使用lambda來指定要由汽車的year屬性進行排序。

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

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) 
+0

只是爲了記錄(我不得不自己看看,順便說一句):['lambda' vs'attrgetter'](http://stackoverflow.com/questions/2705104/lambda-vs-operator-attrgetterxxx-as-sort -key-function-in-python) –

+0

@Matt Ball:感謝您的參考;我看不出兩者之間的速度或可讀性有什麼實質差異,所以讓我們把它稱爲味道的問題。 –