Saya pikir salah satu landasan OOP adalah bahwa, kami memiliki objek, yang merupakan item yang kami minati, dan kemudian kami mengirim pesan kepada mereka.
Jadi mungkin tampak alami bahwa, saya memiliki koleksi barang, dan saya perlu memasukkannya ke dalam satu string, jadi untuk melakukannya:
["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby
(Smalltalk melakukannya dengan cara yang sama). Dalam " | "
beberapa hal dianggap sebagai argumen, salah satu cara untuk bergabung. Bisa " "
juga, jika papan permainan lebih sederhana. Jadi elemen yang bergabung " | "
bukanlah sesuatu yang kita minati - itu bukan objek utama dalam program yang memiliki kepentingan atau signifikansi tertentu.
Jika Python menggunakannya
" | ".join(["x", "o", "o"])
Rasanya agak aneh bahwa hampir rasanya seperti kami menyampaikan pesan ke argumen, untuk mengatakan argumen tentang sesuatu. Mungkin Python lebih prosedural? Untuk memberitahu string yang bergabung untuk melakukan tugas bagi kita?
Apakah ini untuk menyelamatkan implementasi, sehingga kita tidak perlu mendefinisikan a join
untuk setiap kelas koleksi yang kita miliki? Tapi bukankah benar bahwa kita juga bisa menulis sekali saja untuk kelas koleksi apa saja, seperti di Ruby:
module Enumerable
def my_join(joiner)
self.inject {|a,b| a.to_s + joiner + b.to_s}
end
end
(sesuatu seperti ini, memanggil to_s
setiap item, mengandalkan to_s
masing-masing kelas untuk melakukan hal yang benar, untuk mengkonversi ke string, dan kemudian menyatukan mereka). Jadi kita tidak perlu mengimplementasikan untuk setiap String, Hash, atau Set, atau kelas koleksi apa pun yang kita miliki.
Atau apakah Python yang benar tidak menuju rute OOP? Ini menggunakan len("abc")
dan type([])
bukannya "abc".len()
atau [].type()
bahkan di Python3 juga tampaknya. Apakah Python melakukannya dengan alasan desain?
sumber
Maybe Python is more procedural?
Python adalah bahasa prosedural dengan beberapa penambahan fungsional ("Python mengakuisisi lambda, mengurangi (), filter () dan map (), milik seorang hacker Lisp yang melewatkannya dan mengirimkan tambalan yang berfungsi") sampai apa yang tampak di suatu tempat dalam versi 2. Itu sekitar satu dekade setengah setelah pertama kali dikerjakan.Jawaban:
Gabung Python dirancang untuk bekerja pada setiap iterable . Ini berarti para desainer harus memutuskan di mana harus meletakkannya. Karena berfungsi lebih dari sekadar daftar, tetapi selalu membutuhkan (pemisah) dan mengembalikan string, mereka memutuskan untuk menjadikannya bagian dari tipe string.
Armin Ronacher mengatakan itu lebih baik daripada saya:
http://lucumr.pocoo.org/2011/7/9/python-and-pola/#seemingly-inverse-logic
sumber
module Enumerate
bagian tetapi Python tidak bekerja seperti itu, tidak ada superclass tunggal untuk semua iterator di mana Anda bisa meletakkan metode ini.Hash
danString
sebenarnya tidak memiliki kelas koleksi sebagai superclass ... hanya superclass merekaObject
. Jadi dua kelas ini hanya mengandalkan memiliki Enumerable mixin ... sesuatu yang saya mengerti seperti antarmuka untuk memungkinkan serangkaian perilaku koleksi