2013-11-26 4 views
1

У меня есть схема, как:Итератор Python как член класса?

class Base(object): 
    param, d=0, 1 
    def get_all(self): 
     while True: 
      a = self.get_xxx(param) 
      if not a: 
       break 
      handle(a) 
      param += d 

class A(Base): 
    def get_xxx(param): 
     return some_method(param) 

class B(Base): 
    def get_xxx(param): 
     return other_method(param) 

Тогда, я был информирован о том, что для B, после каждого get_xxx парам должно быть а + 1 вместо Param + D. Это означает, что мне нужно извлечь логику изменения параметров в конце get_all. Я придумал схему с использованием итератора:

class Base(object): 
    def get_all(self): 
     get_xxx = self.get_xxx() 
     while True: 
      a = get_xxx.next() 
      if not a: 
       break 
      handle(a) 

class A(Base): 
    def get_xxx(): 
     param, d = 0, 1 
     while True: 
      yield somemethod(param) 
      param += d 

class B(Base): 
    def get_xxx(): 
     param = 0 
     while True: 
      a = somemethod(param) 
      param = a + 1 
      yield a 

Проблема решена, но почему-то мне неловко. Поэтому мне интересно, есть ли лучшее решение? Большое спасибо!

+0

Какая версия Python это? –

+1

Перед тем, как убить StackOverflow, я предлагаю вам ответить на вопрос CodeReview: StackOverflow для технической проблемы (например, «моя собака съела мою программу!»), В то время как CodeReview предназначен для улучшения существующего решения. ссылка: http://codereview.stackexchange.com/ – lucasg

+0

@SimeonVisser 2.7.6 –

ответ

0

Я хотел бы сделать такие вещи, как param и атрибуты d экземпляра:

class Base(object): 
    def __init__(self): 
     self.param = 0 
     self.d = 1 

, то вы не должны передать что-нибудь явно в get_xxx(). Вы можете заменить

param += d 

с

self.iterate_param(a): 

в Base.get_all() затем определить iterate_param() надлежащим образом в ваших двух подклассов, т.е.

class A(Base): 
    ... 
    def iterate_param(self, a): 
     self.param += self.d 

class B(Base): 
    ... 
    def iterate_param(self, a): 
     self.param = a + 1 
Смежные вопросы