2016-09-15 6 views
0

Я читаю код, в котором автор использует стиль кодирования, с которым я не знаком; они ставят абсолютно каждое определение функции в класс. Например (детали удалены, чтобы не идентифицировать автора и кодовую):Зачем использовать один статический метод в классе?

class CSVChecker: 
    @staticmethod 
    def is_ok(file): 
     #some stuff that could return False 
     return True 

и что конец этого класса. Много подобных. № __init__ или self. Использование: if CSVChecker.is_ok(afile)

Это просто странная стилистическая причуда, перенесенная на Python с другого языка? Или есть ли для этого питонская причина, а не только def csv_check_file_ok(file): на верхнем уровне файла?

+4

Я бы предположил, что это странная стилистическая причуда, перенесенная на Python с другого языка. Я видел подробный код Python, написанный программистами Java, который думал, что все должно быть в классе. – khelwood

+1

Метод никогда не используется * динамически *? Потому что это имеет смысл при некоторых обстоятельствах ... 'checkers = [CSVChecker(), ...]; all (c.is_ok (foo) для c в шашках) ' – deceze

+0

Почему бы вам не попросить автора? – jonrsharpe

ответ

1

@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)) 

теперь размышлял, что лучше. Также как это использование классов вписывается в классификацию объектов «наследование, состав, агрегация». И является ли это исключением из

Должен быть один - и предпочтительно только один - простой способ сделать это. Хотя этот способ может быть неразумным сначала, если вы не голландский.

+1

'@ staticmethod' означает, что метод не получает аргумент' self' или 'cls' (он не будет * связан *). Это не значит '@ classmethod'! Вы все еще можете создать экземпляр 'F2' и называть' ok'. Вам также не нужен пустой '__init__', просто опустите его полностью. Данная реализация на самом деле является наилучшим способом записи экземпляра класса с «пустым» '__init__'. – deceze

+0

@deceze снова спасибо. – nigel222

Смежные вопросы