たくさんのオプションがあります!
__init__
メソッドでマップを初期化できます。
def __init__(self):
self.do_map = {"this": self.do_this, "that": self.do_that}
self
インスタンスでルックアップされたおかげで、メソッドは にバインドされます。
または、string-and-getattr アプローチを使用することもできます。これにより、メソッドが確実にバインドされます。
class Foo(object):
do_map = {"this": "do_this", "that": "do_that"}
def my_func(self, item, value):
if item in self.do_map:
getattr(self, self.do_map[item])(value)
または、__get__
記述子プロトコル メソッドを使用して、クラス レベルの辞書内の関数を手動でインスタンスにバインドできます。
class Foo(object):
def do_this(self, value):
...
def do_that(self, value):
...
# at class creation time, the above functions are 'local' names
# so can be assigned to a dictionary, but remain unbound
do_map = {"this": do_this, "that": do_that}
def my_func(self, item, value):
if item in self.do_map:
# __get__ binds a function into a method
method = self.do_map[item].__get__(self, type(self))
method(value)
これはself.method_name
、ボンネットの下で行うことです。method_name
クラス階層で属性を検索し、それをメソッド オブジェクトにバインドします。
または、self
手動で渡すこともできます。
class Foo(object):
def do_this(self, value):
...
def do_that(self, value):
...
# at class creation time, the above functions are 'local' names
# so can be assigned to a dictionary, but remain unbound
do_map = {"this": do_this, "that": do_that}
def my_func(self, item, value):
if item in self.do_map:
# unbound functions still accept self manually
self.do_map[item](self, value)
何を選択するかは、各オプション (開発者の時間は重要です!) にどれだけ慣れているか、ルックアップを実行する必要がある頻度 (インスタンスごとに 1 回か 2 回、またはインスタンスごとにこれらのディスパッチが頻繁に行われるか?) によって異なります。事前にマッピングをキャッシュする__init__
メソッド)、およびこれがどの程度動的である必要があるかについて (これをたくさんサブクラス化しますか? 次に、メソッドでマッピングを非表示にしないでください。それは役に立ちません)。