Я считаю, что сочетание Python объектно-ориентированного this.method()
и процедурного / функционального method(this)
синтаксиса очень тревожно:
x = [0, 1, 2, 3, 4]
x.count(1)
len(x)
any(x)
x.reverse()
reversed(x)
x.sort()
sorted(x)
Это особенно плохо, потому что большое количество функций (а не методов) просто сбрасывается в глобальное пространство имен : методы, относящиеся к спискам, строкам, числам, конструкторам, метапрограммированию, все смешано в один большой отсортированный по алфавиту список.
По крайней мере, функциональные языки, такие как F #, имеют все функции, правильно расположенные в модулях:
List.map(x)
List.reversed(x)
List.any(x)
Так что они не все вместе. Кроме того, это стандарт, которому следуют во всей библиотеке, так что, по крайней мере, он соответствует.
Я понимаю причины использования функции против метода , но я все еще думаю, что плохая идея смешивать их вот так. Я был бы намного счастливее, если бы следовал синтаксису метода, по крайней мере, для обычных операций:
x.count(1)
x.len()
x.any()
x.reverse()
x.reversed()
x.sort()
x.sorted()
Независимо от того, являются ли методы мутирующими или нет, их использование в качестве методов объекта имеет несколько преимуществ:
- Единственное место для поиска «общих» операций над типом данных: другие библиотеки / и т. Д. могут иметь другие причудливые действия, которые они могут делать с типами данных, но все операции «по умолчанию» находятся в методах объекта.
- Не нужно повторять
Module
при звонке Module.method(x)
. Если взять приведенный выше пример функционального списка, почему я должен повторять List
снова и снова? Он должен знать, что это List
и я не хочу вызывать Navigation.map()
функцию! Использование x.map()
синтаксиса делает его СУХИМЫМ и все еще однозначным.
И, конечно, имеет преимущества по сравнению с пут-все , в-глобальном пространстве имен- способ сделать это. Дело не в том, что нынешний способ неспособен добиться цели. Это даже довольно кратко ( len(lst)
), так как ничто не является пространством имен! Я понимаю преимущества использования функций (поведение по умолчанию и т. Д.) Перед методами, но мне все еще не нравится это.
Это просто грязно. А в больших проектах грязь - твой злейший враг.