Я думал, что один из краеугольных камней ООП состоит в том, что у нас есть объекты, с которыми мы имеем дело, и затем мы отправляем им сообщения.
Поэтому может показаться естественным, что у меня есть коллекция предметов, и мне нужно поместить их в одну строку, чтобы сделать это:
["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby
(Smalltalk делает это так же). Это " | "
в некотором роде рассматривается как аргумент, один из признаков того, как присоединиться к нему. Может быть " "
и так, если игровое поле будет проще. Таким образом, объединяющий элемент " | "
не особенно интересует нас - это не основные объекты в программе, которые имеют особое значение или значение.
Если Python делает это с помощью
" | ".join(["x", "o", "o"])
Это действительно несколько странно, что мы почти чувствуем, что мы передаем сообщение аргументу, чтобы сказать аргумент о чем-то. Может, Python более процедурный? Сказать, чтобы соединительная строка выполнила какой-то долг для нас?
Это для того, чтобы сохранить реализацию, чтобы нам не приходилось определять join
для каждого класса коллекции, который у нас есть? Но не правда ли, что мы также можем просто написать один раз для любого класса коллекции, например для Ruby:
module Enumerable
def my_join(joiner)
self.inject {|a,b| a.to_s + joiner + b.to_s}
end
end
(что-то вроде этого, вызывая to_s
каждый элемент, полагаясь на то, что to_s
каждый класс делает свое дело, преобразовывает в строку, а затем объединяет их). Таким образом, нам не нужно реализовывать для каждого из String, Hash или Set или любого другого класса коллекции, который у нас есть.
Или Python вне права не идет по пути ООП? Он использует len("abc")
и type([])
вместо "abc".len()
или [].type()
даже в Python3 тоже кажется. Питон делает это таким образом по причине дизайна?
источник
Maybe Python is more procedural?
Python был процедурным языком с несколькими функциональными дополнениями («Python приобрел lambda, redu (), filter () и map (), любезно предоставленный хакером Lisp, который пропустил их и представил рабочие исправления») до тех пор, пока что-то не появится в версии 2. Это было примерно через полтора десятилетия после того, как над ним впервые работали.Ответы:
Пайтон присоединиться предназначено для работы на любой итерации . Это означает, что дизайнеры должны были решить, где его поставить. Поскольку он работает не только со списками, но всегда требует (разделитель) и возвращает строку, они решили сделать его частью типа строки.
Армин Роначер говорит это лучше меня:
http://lucumr.pocoo.org/2011/7/9/python-and-pola/#seemingly-inverse-logic
источник
module Enumerate
раздела, но Python не работает таким образом, для всех итераторов не существует единого суперкласса, в который можно было бы поместить этот метод.Hash
и наString
самом деле у меня нет класса коллекции как суперкласса ... их суперкласс простоObject
. Таким образом, эти два класса просто полагаются на наличие Enumerable mixin ... что-то, как я понимаю, как интерфейс, позволяющий установить набор поведений коллекции