@deceze, вероятно, имеет ответ в своем комментарии. Некоторые из этих функциональных объектов действительно хранятся в списках, а некоторые элементы списков могут быть экземплярами «правильных» объектов. Лишенные вниз к абсолютным основам:
class F1:
def __init__(self, a):
self.max=a
def ok(self, x):
return x < self.max
class F2:
@staticmethod
def ok(x):
return x > 0
другого
checkers = []
...
checkers.append(F1(i+j))
checkers.append(F2 )
....
if (all(check.ok(x) for check in checkers)
Лично я бы не потрудился с @staticmethod
и просто написан классами, которые не нуждаются в какой-либо инициализации с фиктивным def __init__(self): pass
и инстанцируют F2()
Кроме того, возможно, что перенос стиля с другого языка (Java?), Потому что не все объекты функции одностатического метода используются таким образом. Опять же, если автор думал, что они могут быть использованы в будущем, или может возникнуть необходимость в создании экземпляров с параметрами, это имеет смысл.
В любом случае, я чему-то научился и, надеюсь, другие будут делать в будущем.
EDIT добавлены позже: это использование выполняет то же самое, что, возможно, было сделано с помощью functools.partial
def f1(x, max=None):
return x < max
#elsewhere ...
checkers.append(functools.partial(f1, max=i+j))
теперь размышлял, что лучше. Также как это использование классов вписывается в классификацию объектов «наследование, состав, агрегация». И является ли это исключением из
Должен быть один - и предпочтительно только один - простой способ сделать это. Хотя этот способ может быть неразумным сначала, если вы не голландский.
Я бы предположил, что это странная стилистическая причуда, перенесенная на Python с другого языка. Я видел подробный код Python, написанный программистами Java, который думал, что все должно быть в классе. – khelwood
Метод никогда не используется * динамически *? Потому что это имеет смысл при некоторых обстоятельствах ... 'checkers = [CSVChecker(), ...]; all (c.is_ok (foo) для c в шашках) ' – deceze
Почему бы вам не попросить автора? – jonrsharpe