Python'un birleşmesi, katılmak için öğelere değil, bir tasarım nedeni ile Ruby veya Smalltalk ile karşılaştırıldığında sembole odaklanıyor gibi görünüyor?


9

OOP'un temel taşlarından birinin, ilgilenmek istediğimiz öğeler olan nesnelerimiz olduğunu ve sonra onlara mesajlar gönderdiğimizi düşündüm.

Yani doğal görünebilir, ben bir koleksiyon öğeleri var ve bunu yapmak için onları bir dizeye koymak gerekir:

  ["x", "o", "o"].join(" | ")    # joining a tic-tac-toe row in Ruby

(Smalltalk bunu aynı şekilde yapar). Bir " | "şekilde bir argüman olarak düşünülür, ona nasıl katılacağının bir simgesi. Bu olabilir " "oyun tahtası basit olacaksa da. Dolayısıyla, birleştirme unsuru " | "özellikle ilgilendiğimiz bir şey değildir - programdaki özel önemi veya önemi olan ana nesneler değildir.

Python bunu kullanarak yaparsa

  " | ".join(["x", "o", "o"])

Bir şey hakkında tartışmayı anlatmak için tartışmaya bir mesaj aktarıyormuşuz gibi hissettirmek biraz garip geliyor. Belki Python daha prosedüreldir? Birleştirme dizesine bizim için bir görev yapmasını söylemek

Uygulamayı kaydetmek mi, böylece sahip olduğumuz joinher toplama sınıfı için bir tanımlamak zorunda kalmıyor muyuz? Ancak Ruby gibi herhangi bir koleksiyon sınıfı için sadece bir kez yazabileceğimiz doğru değil:

module Enumerable
  def my_join(joiner)
    self.inject {|a,b| a.to_s + joiner + b.to_s}
  end
end

(böyle bir şey to_s, her bir öğeyi çağırmak , her to_ssınıfın kendi uygun şeyi yapmak, bir dizeye dönüştürmek ve sonra bunları birleştirmek) güvenerek . Bu nedenle, String, Hash veya Set'in her birine veya sahip olduğumuz koleksiyon sınıfına uygulamak zorunda değiliz.

Yoksa Python out doğru OOP yoluna gitmiyor mu? Bu kullanır len("abc")ve type([])yerine "abc".len()ya [].type()da Python3 da öyle görünüyor içinde. Python bunu bir tasarım nedeni ile yapıyor mu?


7
Gönderen Python Zen : "bunu yapmak için seçin-- ve tercihen tek --obvious yolu olmalıdır bu şekilde sürece ediyoruz Hollandalı ilk başta belirgin olmayabilir rağmen.."
kdgregory

2
Bir biçimde, koleksiyon kendisini sınırlayıcı ile bir dizeye nasıl dönüştüreceğini bilir, diğerinde ise bir dize, kendisini ayırıcı olarak kullanarak bir koleksiyonu nasıl birleştireceğini bilir. İkisi de nesne yönelimlidir, ancak fiilin konusunu ve nesnesini değiştirin.
kdgregory

Maybe Python is more procedural?Python, sürümde bir yerde görünene kadar birkaç işlevsel eklemeyle ("Python, lambda, reduce (), filter () ve map (), onları özleyen ve çalışma yamaları sunan" Lisp hacker'ın izniyle) prosedürel bir dildi. 2. Bu, ilk çalıştıktan yaklaşık on buçuk yıl sonraydı.

1
Ve bugün bile Python bir OOP dili olmaya bile çalışmıyor, tamamen çoklu paradigma.

C ++ gibi, Python da OOP'a izin veren bir dildir. Bu, Java veya Smalltalk gibi bir OOP diliyle aynı değildir.
Gort the Robot

Yanıtlar:


9

Python'un birleşimi her türlü yinelenebilir şekilde çalışacak şekilde tasarlanmıştır . Bu, tasarımcıların nereye koyacağına karar vermeleri gerektiği anlamına geliyor. Sadece listelerden daha fazlası üzerinde çalıştığı, ancak her zaman (ayırıcı) gerektirdiğinden ve bir dize döndürdüğünden , dize türünün bir parçası yapmaya karar verdiler.

Armin Ronacher benden daha iyi diyor:

http://lucumr.pocoo.org/2011/7/9/python-and-pola/#seemingly-inverse-logic

"Python'un bu şekilde çalışmadığını düşünün. Bunu bir dizgiye dönüştürmek için ilk önce gerçek bir listeye dönüştürmek zorunda kalacaksınız. Ruby insanlar şimdi Ruby'nin bu sorunu modüllerde karıştırma ile çözdüğünü ve kesinlikle doğru olduğunu iddia edecekler. Ancak bu, birçok etkisi olan dilde bilinçli bir tasarım kararıdır.Python, gerçek uygulamaların başka yerlerde olabileceği bu protokollere sahip olarak gevşek bağlantıyı teşvik eder.Bir nesne yinelenebilir, sistemin başka bir kısmı nasıl yapılacağını bilir bir dizeye. "


1
OP bu module Enumeratebölümü ile ele almaya çalışır, ancak Python bu şekilde çalışmaz, bu yöntemi koyabileceğiniz tüm yineleyiciler için tek bir üst sınıf yoktur.

Ruby 2.0'da da denedim ... Hashve Stringaslında bir süper sınıf olarak bir toplama sınıfım yok ... onların süper sınıfı sadece Object. Yani bu iki sınıf Enumerable mixin'e güveniyor ... bir koleksiyonun davranış kümesine izin vermek için bir arayüz gibi anladığım bir şey
nonopolarity

Bu yüzden, "yinelenebilir" in gerçek kodlu bir sınıf ya da bir şey değil, daha ziyade bir ördek yazma modeli olması bir sınırlama mıdır? Alternatif olarak, sadece Python, aynı uygulama ile herhangi bir koleksiyon üzerinde çalışabilecek kadar genel olmak istediğinden (diğer birçok standart kütüphane, bu koleksiyon için geçerliyse, her koleksiyon için sadece uygular).
Kat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.