2017-01-16 2 views
0
class Runner: 
    """ 
    information of registered runners 
    Attributes: 
     @type email: str 
     email of the registered runner 
     @type category: str 
     the speed they estimate that they can finish the race 
     @type list: clist 
     the list of runners in the same category 

    """ 
    under_twenty_min = [] 
    under_thirty_min = [] 
    under_forty_min = [] 
    forty_and_above = [] 

    def __init__(self, email, category): 
     """Register the email and the speed estimation of runners 

      @type self: Runner 
      @type email: str 
      @type speed: int 
      @type category:str 
      @type clist: list 
      @rtype: list 

     >>>runner1=Runner('[email protected]','under 40 min') 
     >>>runner1.email 
     '[email protected]' 
     >>>runner1.category 
     'under 40 min' 
     """ 
     self.email = email 
     self.category = category 
     if category=='under 20 min': 
      self.clist=under_twenty_min 
     elif category=='under 30 min': 
      self.clist = under_twenty_min 
     elif category=='under 40 min': 
      self.clist = under_forty_min 
     elif category=='40 min and over': 
      self.clist = forty_and_over 
     renew(self,clist) 
     return clist 

В основном я должен вернуть список бегунов с одинаковой скоростью, когда инициализируется бегун, но я не могу назначить перечисленные выше списки атрибуту класса, есть ли все равно, чтобы исправить его?Python: Я не могу назначить определенный список атрибуту класса?

+1

в acceess атрибуты пространства имен классов используют это обозначение 'self.clist = Runner.under_twenty_min' –

+0

' '' вернуть clist''' -> '' 'обратный self.clist''' и' '' renew (self, clist) '' '->' '' renew (self, self.clist) '' '. Вероятно, вы должны показать нам '' 'renew''' - это метод класса или * автономной * функции? – wwii

+1

Странно, что '' '__init__'' должен вернуть список - http://stackoverflow.com/a/2491831/2823755 – wwii

ответ

4

Вы должны явно указать класс при доступе к переменным класса:

if category == 'under 20 min': 
    self.clist = Runner.under_twenty_min 
elif category == 'under 30 min': 
    self.clist = Runner.under_twenty_min 
elif category == 'under 40 min': 
    self.clist = Runner.under_forty_min 
elif category == '40 min and over': 
    self.clist = Runner.forty_and_over 
+1

Вы также можете использовать 'self .__ class__' и/или' @ classproperty' для более динамичного поведения – slezica

1

Вы можете использовать Dict, установить каждое catgory имя в качестве ключа и значение представляет собой список всех бегунов в этой категории.
здесь простая реализация

from collections import defaultdict 

#runners is a list of all your runners 

def get_runners_by_cat(): 
    d = defaultdict(list) 
    for runner in runners: 
     dict[runner.category].append(runner) 
    return d 
0

Есть несколько вещей, которые вы должны изменить в своем коде:

  1. Углубление метода init должен быть с отступом в определении класса.
  2. Как указывает @Tamas, вам нужно явно указать, что переменные являются переменными класса.
  3. Как упоминает @taoufik, может быть удобно определить словарь.
  4. A init метод не должен возвращать ничего (кроме None). Так как ваше требование состоит в том, чтобы вернуть бегунов, вы можете добавить дополнительный метод, предложенный @taofik (или вы можете просто распечатать их после создания, как показано ниже).

Вот обновленная версия кода. Надеюсь, поможет.

class Runner: 
    """ 
    information of registered runners 
    Attributes: 
     @type email: str 
     email of the registered runner 
     @type category: str 
     the speed they estimate that they can finish the race 
     @type list: clist 
     the list of runners in the same category 

    """ 
    clist = { 
     'under_twenty_min': [], 
     'under_thirty_min': [], 
     'under_forty_min':[], 
     'forty_and_above': [] 
    } 

    def __init__(self, email, category): 
     """Register the email and the speed estimation of runners 

      @type self: Runner 
      @type email: str 
      @type speed: int 
      @type category:str 
       @type clist: list 
      @rtype: list 

     >>>runner1=Runner('[email protected]','under 40 min') 
     >>>runner1.email 
     '[email protected]' 
      >>>runner1.category 
     'under 40 min' 
     """ 
     self.email = email 
     self.category = category 

     if category=='under 20 min': 
      Runner.clist['under_twenty_min'].append(self) 
      print Runner.clist['under_twenty_min'] 
     elif category=='under 30 min': 
      Runner.clist['under_thirty_min'].append(self) 
      print Runner.clist['under_thirty_min'] 
     elif category=='under 40 min': 
      Runner.clist['under_forty_min'].append(self) 
      print Runner.clist['under_forty_min'] 
     elif category=='40 min and over': 
      Runner.clist['forty_and_above'].append(self) 
      print Runner.clist['forty_and_above'] 
0
#get class name, convert it to class object 
if category=='under 20 min': 
    self.clist= eval(self.__class__.__name__).under_twenty_min 
elif category=='under 30 min': 
    self.clist = eval(self.__class__.__name__).under_thirty_min 
elif category=='under 40 min': 
    self.clist = eval(self.__class__.__name__).under_forty_min 
elif category=='40 min and over': 
    self.clist = eval(self.__class__.__name__).forty_and_above 
Смежные вопросы