2013-11-26 44 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 PARAM後應該是+ 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

我會做的事情一樣paramd實例屬性:

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