2012-01-25 2 views
2

他のオブジェクトを保持するオブジェクトを作成し、それが保持しているオブジェクトごとにメソッドを呼び出す必要があります。最終目標は、プログラム用のスクリプトを生成することです。各オブジェクトには、printCommand()で印刷可能なコマンドが含まれており、最終的にファイルに格納されます。私の元の解決策はこれでした:Pythonのリストクラスを拡張して内容に追加機能を実行しますか?

a = ObjectList() 
a.appendObject(Object()) 
b = ObjectList() 
b.appendObject(Object()) 

listOfObjects = [a, b] 
for Object in listOfObjects: 
    Object.printCommand() 

私はリスト変数を作成し、リストにオブジェクトを追加してから、コマンドを発行してループオーバーします。これはうまくいきますが、私は主にプログラミングを教えるためにこれをやっていますので、オブジェクトのリストにアイテムを追加、ポップするなどのコードを書くよりも洗練されたソリューションがあるかどうかを知りたいと思います。 listはすでに、これらの機能が含まれているので、私が行うには、正しいものはlistを延長するだろう考えていた:

class Object: 
    def __init__(self): 
     self.Command = "Script Command" 

    def printCommand(self): 
     print(self.Command) 

class ObjectList(list): 
    def printCommand(self): 
     for Object in self.LISTCONTENTS: 
      Object.printCommand() 

しかし、私は、独自の内容を反復処理するためにそれを言うだろう方法についての損失でいます。 self.LISTCONTENTSに属しているものは? listオブジェクトはそのコンテンツをどこに格納しますか?メソッドからどのようにアクセスしますか?

答えて

1

あなただけselfを反復処理することができます。

スーパークラスのメソッド(すなわち、__iter__())がすべて存在しています。のの文脈でselfと言うと、適切なメソッドが呼び出されます。

class Object: 
    def __init__(self): 
     self.Command = "Script Command" 

    def printCommand(self): 
     print(self.Command) 

class ObjectList(list): 
    def printCommand(self): 
     for Object in self: 
      Object.printCommand() 

lst = ObjectList() 
lst.append(Object()) 
lst.append(Object()) 

lst.printCommand() 

これが機能する方法はlistであるオブジェクトの繰り返し処理を行う場合、舞台裏と呼ばれる__iter__を実装していません: `map`は副作用のためではない、どちらもリストされている:再(C)

>>> for e in [1,2,3].__iter__(): 
... print(e) 
... 
1 
2 
3 
>>> for e in [1,2,3]: 
... print(e) 
... 
1 
2 
3 
1

(a)Objectと呼ばれるクラスを作成しないでください。それはobjectに非常に近すぎます。

(b)listから継承する必要はまったくなく、率直に言えば、自分のクラスを使用する必要はまったくありません。

(c)リストのすべての要素で関数を呼び出す通常の方法は、mapを使用することです。同じ関数を繰り返しマップする必要がある場合は、partialを使用して、その関数をmapの最初の引数にバインドすることができます。

ここでドキュメントをご覧ください。

+1

理解。 'for'ループだけを使用してください。 – delnan

+0

@delnan:副作用として使用できない理由はありません。それが気になる場合、オプションにはジェネレータ式が含まれています。また、リスト作成以外のイテレータ関数を記述することもできます。いずれにしても、ここでの継承は単に不要です。 – Marcin

+0

もちろん、それは可能ですが、それは慣用的ではありません。 'for'ループは正しい(広く受け入れられている)選択肢です - あなたが正しく述べたように、奇妙なOPが提案するものではありません。 – delnan

関連する問題