你有很多选择!
您可以在方法中初始化地图__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)
你选择什么取决于你对每个选项的感觉有多舒服(开发人员的时间很重要!),你需要多久进行一次查找(每个实例一次或两次,或者这些调度是否在每个实例中完成了很多?然后也许将绑定方法放入预先缓存映射的__init__
方法),以及这需要多么动态(您是否经常将其子类化?然后不要将映射隐藏在方法中,这无济于事)。