SimpleIterator_Forms.py
- Windows Forms アプリケーションとして、IronPython で実現した事例を紹介します。
# -*- coding: utf-8 -*- #=============================================================================== # Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部 # # History: Design Pattern # 2008/01/25, IronPython 1.1.1 (download) # 2008/08/22, IronPython 1.1.2 (download) # 2008/01/15, ver.1.0, Windows Forms # 2008/09/28, ver.2.1, IronPython 1.1.2 #=============================================================================== import clr clr.AddReference("System.Drawing") from System.Drawing import * clr.AddReference("System.Windows.Forms") from System.Windows.Forms import *
KidData.cs
class KidData: # IEnumerator def __init__(self, filename): self.kids = [] # ArrayList fl = csFile(filename) for line in fl.file().readlines(): kd = Kid(line) self.kids.append(kd) else: fl.close() self.index = 0
- ArrayList に代えて、list を利用しています。
def next(self): # MoveNext; Current current = self.index if current < len(self.kids): # .Count self.index += 1 return self.kids[current] else: raise StopIteration
- MoveNext/Current に代えて、next を定義しています。
- Count に代えて、len を利用しています。
- 参照できる要素がなくなると、StopIteration を生成しています。
def __iter__(self): # getIterator
return self
- getIterator に代えて、__iter__ を定義しています。
Form1.cs
class SimpleIterator_Forms(Form): def __init__(self, **args): self.InitializeComponent() self.init() def init(self): kids = KidData("50free.txt") for kd in kids: self.lsKids.Items.Add(kd.frname+" "+kd.lname) def InitializeComponent(self): self.lsKids = self._grdProd() self._Controls() def _grdProd(self): return ListBox( Location = Point(40, 32), Size = Size(208, 173), ) def _Controls(self): self.ClientSize = Size(292, 273) e = self.lsKids self.Controls.Add(e) self.Text = "Simple Iterator Demo"
- Controls に各コントロール e を追加します。
__main__
if __name__ == "__main__": form = SimpleIterator_Forms() form.Text = form.__class__.__name__ Application.Run(form)
50free.txt
《参考文献》
- C# Design Patterns 24. The Iterator Pattern.