1

これを行う方法があることを本当に望んでいます:

オブジェクトに適用するメソッドのリストをPythonで作成するにはどうすればよいですか?

任意のクラスが与えられた場合:

class someClass:
    def __init__(self, s):
        self.size=s
    def shrink(self):
        self.size-=1
    def grow(self):
        self.size+=1
    def invert(self):
        self.size= -self.size

このリストのような反復可能なオブジェクトを記述できるようにしたい:

instructions=[shrink,grow,shrink,shrink,grow,invert]

後で for ループを実行するには:

elephant=someClass(90)
sizeList=[]
for ins in instructions:
    elephant.ins()
    sizeList.append(elephant.size)

以前に関数で同様のことを行ったことがありますが、メソッドでこれを行うことができないと、恐ろしい量のコードを書き直す必要があります...

4

4 に答える 4

6
instructions = ["shrink","grow","shrink"]
for i in instructions:
     getattr(elephant,i)()
于 2012-10-02T21:33:26.963 に答える
3

命令のリストに文字列を使用する代わりに、次のことができます。

instructions = [someClass.shrink, someClass.grow, someClass.shrink,
                someClass.shrink, someClass.grow, someClass.invert]
elephant = someClass(90)
sizeList = []
for ins in instructions:
    ins(elephant)
    sizeList.append(elephant.size)
于 2012-10-02T21:36:57.930 に答える
1

を使用dirして、オブジェクトのすべてのプロパティ名を取得したり、オブジェクトgetattrのプロパティ値を取得したりできます。呼び出し不可能なプロパティ (2または など"foo")を呼び出さないこともできます。

for m in dir(elephant):
    if not m.startswith('_'):
        f = getattr(elephant, m)
        if callable(f): # Do not try to call non-function properties
            f()
于 2012-10-02T21:34:50.770 に答える
0

おそらく素朴に:

for ins in instructions:
  getattr(elephant, ins)()

落とし穴にはins、文字列である必要があり、それinsが本当に呼び出したいものでgetattr(elephant, ins)あり、呼び出し可能であることの両方を検証するのがおそらく賢明であることが含まれます。

于 2012-10-02T21:33:35.293 に答える