Eu pensei que uma das pedras angulares do OOP é que, temos objetos, que são os itens com os quais estamos interessados em lidar, e então enviamos mensagens para eles.
Portanto, pode parecer natural que eu tenha uma coleção de itens e precise colocá-los em uma única sequência, para fazê-lo:
["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby
(Smalltalk faz da mesma maneira). De " | "
alguma forma, é considerado um argumento, um sinal de como se juntar a ele. Pode ser " "
também, se o tabuleiro do jogo for mais simples. Portanto, o elemento de junção " | "
não é particularmente algo em que temos interesse - não são os principais objetos do programa que têm importância ou significado particular.
Se o Python fizer isso usando
" | ".join(["x", "o", "o"])
Parece um pouco estranho que quase pareça que estamos passando uma mensagem para o argumento, para contar o argumento sobre algo. Talvez o Python seja mais processual? Para dizer à cadeia de junção para realizar algum dever para nós?
É para salvar a implementação, para que não tenhamos que definir um join
para cada classe de coleção que temos? Mas não é verdade que também podemos escrever apenas uma vez para qualquer classe de coleção, como no Ruby:
module Enumerable
def my_join(joiner)
self.inject {|a,b| a.to_s + joiner + b.to_s}
end
end
(algo assim, chamando to_s
cada item, confiando no que to_s
cada classe faz para fazer suas próprias coisas, para converter em uma sequência e concatená-las). Portanto, não precisamos implementar para cada String, Hash ou Set, ou qualquer classe de coleção que tenhamos.
Ou o Python certo não segue a rota OOP? Ele usa len("abc")
e, em type([])
vez de "abc".len()
ou [].type()
mesmo em Python3, também parece. O Python faz dessa maneira por um motivo de design?
fonte
Maybe Python is more procedural?
Python era uma linguagem processual com algumas adições funcionais ("Python adquiriu lambda, reduza (), filtra () e mapa (), cortesia de um hacker Lisp que as perdeu e enviou correções de trabalho") até o que parece estar em algum lugar na versão 2. Isso foi cerca de uma década e meia após o primeiro trabalho.Respostas:
A junção do Python foi projetada para funcionar em qualquer iterável . Isso significa que os designers tiveram que decidir onde colocá-lo. Como funciona em mais do que apenas listas, mas sempre requer (separador) e retorna uma sequência, eles decidiram fazer parte do tipo de sequência.
Armin Ronacher diz isso melhor do que eu:
http://lucumr.pocoo.org/2011/7/9/python-and-pola/#seemingly-inverse-logic
fonte
module Enumerate
seção, mas o Python não funciona dessa maneira, não existe uma superclasse para todos os iteradores em que você pode colocar esse método.Hash
eString
na verdade não tenho uma classe de coleção como superclasse ... a superclasse deles é justaObject
. Então, essas duas classes confiar apenas em ter o mixin Enumerable ... algo que eu entendo como uma interface para permitir o conjunto de comportamentos de uma coleção