ดูเหมือนว่าการเข้าร่วมของ Python จะไม่ได้มุ่งเน้นไปที่รายการที่จะเข้าร่วม แต่บนสัญลักษณ์เมื่อเทียบกับ Ruby หรือ Smalltalk ด้วยเหตุผลด้านการออกแบบ


9

ฉันคิดว่าหนึ่งในหลักสำคัญของ OOP คือเรามีวัตถุซึ่งเป็นรายการที่เราสนใจในการจัดการและจากนั้นเราส่งข้อความถึงพวกเขา

ดังนั้นมันอาจดูเป็นธรรมชาติที่ฉันมีของสะสมและฉันจำเป็นต้องใส่มันเข้าไปในสายเดียวเพื่อที่จะทำมัน:

  ["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 ไม่ถูกต้องหรือไม่ไปตามเส้นทาง OOP มันใช้len("abc")และtype([])แทนที่จะเป็น"abc".len()หรือ[].type()แม้แต่ใน Python3 เหมือนกัน Python ทำสิ่งนี้ด้วยเหตุผลด้านการออกแบบหรือไม่?


7
จากThe Zen of Python : "ควรมีอย่างใดอย่างหนึ่ง - และดีกว่าเพียงวิธีเดียว - วิธีที่ชัดเจนที่จะทำแม้ว่าวิธีนั้นอาจไม่ชัดเจนในตอนแรกเว้นแต่ว่าคุณเป็นชาวดัตช์"
kdgregory

2
ในรูปแบบหนึ่งคอลเล็กชันรู้วิธีแปลงตัวเองเป็นสตริงด้วยตัวคั่นในอีกรูปแบบหนึ่งรู้วิธีเชื่อมคอลเลกชันโดยใช้ตัวเองเป็นตัวคั่น ทั้งคู่เป็นแบบเชิงวัตถุ แต่เปลี่ยนหัวเรื่องและวัตถุของคำกริยา
kdgregory

Maybe Python is more procedural?Python เป็นภาษาขั้นตอนที่มีการใช้งานเพิ่มเติมเล็กน้อย ("Python ได้รับแลมบ์ดา, ลด (), ตัวกรอง () และแผนที่ (), ความอนุเคราะห์จากแฮ็กเกอร์ Lisp ที่คิดถึงพวกเขาและส่งแพทช์ทำงาน") 2. นั่นคือประมาณหนึ่งทศวรรษครึ่งหลังจากที่มันถูกใช้งานครั้งแรก

1
และแม้กระทั่งทุกวันนี้ Python ก็ไม่ได้พยายามเป็นภาษา OOP มันเป็นกระบวนทัศน์ที่หลากหลาย

เช่นเดียวกับ C ++ Python เป็นภาษาที่อนุญาตให้ใช้ OOP นี่ไม่ใช่ภาษา OOP เช่น Java หรือ Smalltalk
Gort the Robot

คำตอบ:


9

ของงูหลามเข้าร่วมถูกออกแบบมาเพื่อการทำงานใด ๆiterable ซึ่งหมายความว่านักออกแบบจะต้องตัดสินใจว่าจะวางที่ใด เนื่องจากมันทำงานได้มากกว่ารายการเพียง แต่ต้องการ (ตัวคั่น) และส่งคืนสตริงเสมอจึงตัดสินใจที่จะทำให้มันเป็นส่วนหนึ่งของชนิดสตริง

Armin Ronacher บอกว่ามันดีกว่าฉัน:

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

"Imagine Python จะไม่ทำงานอย่างนั้นคุณจะต้องแปลง iterable เป็นรายการจริงก่อนที่จะแปลงเป็น string ตอนนี้ผู้คน Ruby จะเถียงว่า Ruby แก้ปัญหานี้ด้วยการผสมในโมดูลและแน่นอนว่าพวกมันถูกต้อง เป็นตัวเลือก แต่นี่เป็นการตัดสินใจออกแบบอย่างพิถีพิถันในภาษาที่มีความหมายหลายอย่าง Python สนับสนุนการมีเพศสัมพันธ์อย่างหลวม ๆ โดยมีโปรโตคอลเหล่านี้ซึ่งการใช้งานจริงสามารถอยู่ที่อื่นได้วัตถุหนึ่งเป็น iterable ส่วนหนึ่งในระบบรู้วิธี เป็นสตริง "


1
OP พยายามจัดการกับmodule Enumerateส่วนนี้ แต่ Python ไม่ทำงานอย่างนั้นไม่มีซูเปอร์คลาสเดียวสำหรับตัววนซ้ำทั้งหมดที่คุณสามารถวางวิธีนี้ได้

ฉันพยายามในรูบี 2.0 เกินไป ... HashและStringที่จริงไม่ได้มีระดับคอลเลกชันเป็น superclass แล้ว ... superclass Objectของพวกเขาเป็นเพียง ดังนั้นสองชั้นนี้พึ่งพาการมิกซ์อิน Enumerable ... สิ่งที่ฉันเข้าใจเหมือนอินเทอร์เฟซสำหรับอนุญาตให้ชุดของพฤติกรรมของคอลเลกชัน
nonopolarity

ดังนั้นจึงเป็นข้อ จำกัด ของความจริงที่ว่า "iterable" ไม่ใช่คลาสหรือบางอย่างที่มีรหัสจริง แต่เป็นรูปแบบการพิมพ์เป็ด หรืออาจเป็นเพราะ Python ต้องการให้เป็นเรื่องทั่วไปเพื่อให้สามารถทำงานกับคอลเลกชันใด ๆ ที่มีการใช้งานเหมือนกัน (ในขณะที่หลาย ๆ ไลบรารี่มาตรฐานอื่น ๆ จะใช้มันสำหรับแต่ละคอลเลกชันเท่านั้น
Kat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.