Pensé que una de las piedras angulares de OOP es que tenemos objetos, que son los elementos con los que estamos interesados en tratar, y luego les enviamos mensajes.
Por lo tanto, puede parecer natural que tenga una colección de artículos, y necesito ponerlos en una cadena, para hacerlo:
["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby
(Smalltalk lo hace de la misma manera). De " | "
alguna manera, se considera como un argumento, una muestra de cómo unirse a él. También puede serlo " "
, si el tablero de juego es más simple. Por lo tanto, el elemento de unión " | "
no es particularmente algo en lo que tengamos interés, no son los objetos principales del programa los que tienen una importancia o significado particular.
Si Python lo hace usando
" | ".join(["x", "o", "o"])
Se siente algo extraño que casi parece que estamos pasando un mensaje al argumento, para decirle al argumento sobre algo. ¿Quizás Python es más procesal? ¿Decirle a la cadena de unión que realice algún deber para nosotros?
¿Es para guardar la implementación, de modo que no tengamos que definir un join
para cada clase de colección que tenemos? Pero, ¿no es cierto que también podemos escribir una vez para cualquier clase de colección, como en Ruby:
module Enumerable
def my_join(joiner)
self.inject {|a,b| a.to_s + joiner + b.to_s}
end
end
(algo como esto, recurriendo to_s
a cada elemento, confiando en que to_s
cada clase haga lo propio, convertirlo en una cadena y luego concatenarlos). Entonces no tenemos que implementar para cada String, Hash o Set, o cualquier clase de colección que tengamos.
¿O Python sale bien y no sigue la ruta OOP? Utiliza len("abc")
y en type([])
lugar de "abc".len()
o [].type()
incluso en Python3 también parece. ¿Python lo hace de esta manera por una razón de diseño?
fuente
Maybe Python is more procedural?
Python era un lenguaje de procedimiento con algunas adiciones funcionales ("Python adquirió lambda, reduce (), filter () y map (), cortesía de un hacker de Lisp que los perdió y envió parches de trabajo") hasta que parece estar en algún lugar de la versión 2. Eso fue aproximadamente una década y media después de que se trabajó por primera vez.Respuestas:
La combinación de Python está diseñada para funcionar en cualquier iterable . Esto significa que los diseñadores tuvieron que decidir dónde colocarlo. Como funciona en más que solo listas, pero siempre requiere (separador) y devuelve una cadena, decidieron hacerla parte del tipo de cadena.
Armin Ronacher lo dice mejor que yo:
http://lucumr.pocoo.org/2011/7/9/python-and-pola/#seemingly-inverse-logic
fuente
module Enumerate
sección, pero Python no funciona de esa manera, no hay una superclase única para todos los iteradores donde podría colocar este método.Hash
y enString
realidad no tengo una clase de colección como superclase ... su superclase es justaObject
. Entonces, estas dos clases solo confían en tener el Enumerable mixin ... algo que entiendo como una interfaz para permitir el conjunto de comportamientos de una colección