1. ホーム
  2. python

[解決済み] オブジェクトのリストに対して同じメソッドを呼び出すには?

2023-03-20 08:15:17

質問

このようなコードがあったとします。

class Base:
    def start(self):
        pass
    def stop(self)
        pass

class A(Base):
    def start(self):
        ... do something for A
    def stop(self)
        .... do something for A

class B(Base):
    def start(self):

    def stop(self):

a1 = A(); a2 = A()
b1 = B(); b2 = B()

all = [a1, b1, b2, a2,.....]

今、私はすべてのリストの各オブジェクトのためにメソッド開始と停止を(多分他のも)呼びたいと思っています。のような関数の束を書くこと以外に、これを行うためのエレガントな方法はあるでしょうか?

def start_all(all):
    for item in all:
        item.start()

def stop_all(all):

どのように解決するのですか?

*_all()関数はとてもシンプルなので、いくつかのメソッドについては、関数を書くだけでいいと思います。同じ関数がたくさんある場合は、汎用的な関数を書けばいい。

def apply_on_all(seq, method, *args, **kwargs):
    for obj in seq:
         getattr(obj, method)(*args, **kwargs)

あるいは、関数ファクトリーを作る。

def create_all_applier(method, doc=None):
    def on_all(seq, *args, **kwargs):
        for obj in seq:
            getattr(obj, method)(*args, **kwargs)
    on_all.__doc__ = doc
    return on_all

start_all = create_all_applier('start', "Start all instances")
stop_all = create_all_applier('stop', "Stop all instances")
...