Во многих случаях есть два варианта реализации: закрытие и вызываемый класс. Например,
class F:
def __init__(self, op):
self.op = op
def __call__(self, arg1, arg2):
if (self.op == 'mult'):
return arg1 * arg2
if (self.op == 'add'):
return arg1 + arg2
raise InvalidOp(op)
f = F('add')
или
def F(op):
if op == 'or':
def f_(arg1, arg2):
return arg1 | arg2
return f_
if op == 'and':
def g_(arg1, arg2):
return arg1 & arg2
return g_
raise InvalidOp(op)
f = F('add')
Какие факторы следует учитывать при выборе в любом направлении?
Я могу думать о двух:
Кажется, что закрытие всегда будет иметь лучшая производительность (не может придумайте контрпример).
Я думаю, что бывают случаи, когда закрытие не может выполнить свою работу (например, если его состояние меняется со временем).
Прав ли я в этом? Что еще можно было добавить?