2017-02-07 3 views
0

У меня есть список с измерениями, например:«список» объект не имеет атрибута «метод»

[[Measurements(100, 0.3)], 
[Measurements(33, 0.5)]] 

Тогда у меня есть список с некоторыми критериями, в котором содержится список измерений:

[Criteria(999, [[Measurements(100, 0.3)], 
         [Measurements(33, 0.5)]])], 

[Criteria(999, [[Measurements(150, 0.3)], 
         [Measurements(35, 0.5)]])] 

Наконец, я хочу поставить выше список в качестве входных данных и выполнить код:

class Measurements(): 
    def __init__(self, value, other): 
     self.value = value 
     self.other = other 


class Criteria(): 
    def __init__(self, new_value, measurements): 
     self.new_value = new_value 
     self.measurements = measurements 

    def method(self): 

     # Here, I am iterating through all measurements 
     # and replace the value according to criteria 
     for idx, x in enumerate(self.measurements): 
      if (self.measurements[idx].value > 20 and 
        self.measurements[idx].value < 110): 

       self.measurements[idx].value = self.new_value 
     return self.measurements 


class Evaluate(): 
    def __init__(self, criteria): 
     self.criteria = criteria 

    def execute(self): 
     criteria = self.criteria 

     # Here, I am iterating through all criteria 
     # and call the method from criteria 
     for i, c in enumerate(criteria): 
      c.method() 
      return c.measurements 


def main(): 

    criteria = [ 
     [Criteria(999, [[Measurements(100, 0.3)], 
         [Measurements(33, 0.5)]])], 

     [Criteria(999, [[Measurements(150, 0.3)], 
         [Measurements(35, 0.5)]])] 
    ] 

    obs = (Evaluate(criteria).execute()) 


if __name__ == "__main__": 
    main() 

и я получаю c.method() AttributeError: 'list' object has no attribute 'method'

Я хочу, чтобы мои результаты будут новые исправленные измерениями, так:

[[Measurements(999, 0.3)], 
[Measurements(999, 0.5)]], 
[Measurements(150, 0.3)], 
[Measurements(999, 0.5)]] 
+4

Почему вы вложенные списки? 'c' is' [Criteria (999, ...)] ', список с одним элементом в нем, * не *' Критерии (999, ...) '. –

+0

У меня есть вложенные списки, потому что у меня будет много критериев, которые я хочу оценить. – George

+1

Это не требует * вложенных * списков. –

ответ

2

Всех ваших Criteria() и Measurement() объектов, каждый из сохраненных в списке один-элемента , который, в свою очередь, сохраняется в большем список. Либо учтите это, либо не используйте одноэлементные вложенные списки.

Я не вижу причин для этих одноэлементных списков; следующее определение должно сделать код работы:

criteria = [ 
    Criteria(999, [Measurements(100, 0.3), Measurements(33, 0.5)]), 
    Criteria(999, [Measurements(150, 0.3), Measurements(35, 0.5)]), 
] 

Вы в противном случае придется либо извлечь, что один из элементов, каждый раз, или использовать вложенные циклы:

def execute(self): 
    for c in self.criteria: 
     c[0].method() 

или

def execute(self): 
    for c_list in self.criteria: 
     for c in c_list: 
      c.method() 

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

Вы также используете слишком много раз в петле Criteria.method(). Нет необходимости в enumerate(), вам не нужны индексы для изменения изменяемых объектов.

Исправленный код:

class Measurements(): 
    def __init__(self, value, other): 
     self.value = value 
     self.other = other 


class Criteria(): 
    def __init__(self, new_value, measurements): 
     self.new_value = new_value 
     self.measurements = measurements 

    def method(self): 
     for measurement in self.measurements: 
      if 20 < measurement.value < 110: 
       measurement.value = self.new_value 
     return self.measurements 

class Evaluate(): 
    def __init__(self, criteria): 
     self.criteria = criteria 

    def execute(self): 
     results = [] 
     for c in self.criteria: 
      measurements = c.method() 
      results.extend(measurements) 
     return results 

def main(): 
    criteria = [ 
     Criteria(999, [Measurements(100, 0.3), Measurements(33, 0.5)]), 
     Criteria(999, [Measurements(150, 0.3), Measurements(35, 0.5)]), 
    ] 

    obs = Evaluate(criteria).execute() 
+0

Хорошо, спасибо за помощь и предложения! Итак, моя главная проблема заключалась в вложенных списках, и это вообще не работало! Что касается возврата, то в цикле for это будет вернуть только первые вычисления, правильно? (вверх) – George

+0

@George: точно; 'return' выйдет из функции прямо там, поэтому будет возвращен только первый результат. –

+0

Спасибо. Можете ли вы сказать мне в этом случае (http://pastebin.com/Dc7dzaVp), как я могу справиться с возвратом, если у меня много дел? (Я имею в виду, хорошо, что у меня может быть много циклов в каждом случае, но мне было интересно, есть ли что-то еще) – George

Смежные вопросы