มาพูดถึงสิ่งที่ฟังดูค่อนข้างซับซ้อน
เรียกว่า MRO หรือลำดับความละเอียดของเมธอด
มันหมายความว่าอะไร?
ฉันมีตัวอย่างที่นี่สำหรับคุณ
สมมุติว่าเรามีคลาส A คลาสของ B ที่สืบทอดมาจากคลาสของ A ไม่ทำอะไรเลย
แล้วเราก็มีคลาส C ที่สืบทอดมาจาก A อีกครั้ง แล้วก็สุดท้ายเป็นคลาส D แล้วก็สืบทอดมาจาก
B และ C
ดังนั้นเราจึงมีสองคลาสที่ไม่ทำอะไรเลย และจากนั้นคลาส A และคลาส C ที่มีแอตทริบิวต์อ็อบเจกต์คลาสเดียวกัน
และฉันได้วาดออกมาจริงๆ ว่าความสัมพันธ์นี้เป็นอย่างไร
คุณเห็นว่า D มีมรดกหลายอย่างจาก B และ C และ B และ C สืบทอดมาจาก A
และ Amro หรือลำดับความละเอียดของเมธอดเป็นกฎที่ Python ปฏิบัติตามเพื่อกำหนดเมื่อคุณเรียกใช้เมธอดที่จะรันเมื่อคุณมีโครงสร้างการสืบทอดที่ซับซ้อนเช่นนั้น
Amro เป็นกฎที่บอกว่า เฮ้ ทำนี่ ทำนี่ แล้วก็ทำอย่างนั้น
และนั่นคือวิธีที่คุณควรเรียกใช้
ให้ฉันแสดงให้คุณเห็นว่าฉันหมายถึงอะไร
สมมุติว่าผมอยากพิมพ์ dx dot num
คุณคิดว่าจะเกิดอะไรขึ้นที่นี่?
ให้ฉันย้ายสิ่งนี้ออกไปให้พ้นทางหรือแสดงความคิดเห็น
ถ้าฉันทำสิ่งนี้ คุณเดาได้ไหมว่าจะเกิดอะไรขึ้น?
ถ้าฉันคลิกเรียกใช้
ฉันได้รับหนึ่ง?
นั่นคือสิ่งที่คุณคาดหวัง?
ลองดูสิ่งนี้
DD สืบทอดมาจาก B และ C
แล้วผู้สืบทอดจากข้าพเจ้า
ดังนั้นเราจึงได้อันหนึ่งเพราะ MRO ลำดับความละเอียดของเมธอดคือมันไม่ไป D, b, a
แทนที่จะไป d.
ข.
ค.
ก.
อืม.
ลองคิดเกี่ยวกับเรื่องนี้อีกสักหน่อย
และ Miro ก็แค่พูดว่าอะไรเป็นอย่างแรกในบรรทัด ถ้าสิ่งที่เป็นเรื่องปกติระหว่างคลาส เมธอด หรือตัวแปร หรือแอตทริบิวต์?
ฉันควรเลือกอะไร
และมีวิธีที่ดีจริง ๆ ที่เราจะตรวจสอบสิ่งนี้ ถ้าฉันทำ Miro แล้วเรียกใช้แบบนี้
วิ่งทะเลสาบปลอม
ดูนั่นสิ
นี่คือคำสั่งหรือ Maro ของคลาสนี้
มันบอกว่า เฮ้ ฉันจะตรวจสอบ D ก่อน
หากคุณโทร ให้เรียก D dot name หรือ d dot num
ฉันจะตรวจสอบจุดหลัก D ก่อน
ผมจะตรวจคลาสนี้ แล้วผมจะตรวจสอบจุด B หลัก ผมจะตรวจ
B แล้วตรวจ C
แล้วฉันจะตรวจสอบ
และสุดท้าย ผมจะตรวจสอบวัตถุคลาสฐานอีกครั้ง
เราเคยเห็นมาก่อนแล้ว
เป็นคลาสพื้นฐานที่อ็อบเจ็กต์ทั้งหมดใน Python สืบทอดมา
นั่นคือลำดับที่จะตรวจสอบ
ทีนี้ ถ้าเราผ่านสิ่งเหล่านี้ทั้งหมด
และฉันคลิกเรียกใช้
ฉันจะได้รับอากาศ
D ไม่มีแอตทริบิวต์ numb เพราะมันผ่านเส้นทางนี้ทั้งหมด แม้แต่ตรวจสอบวัตถุฐานและไม่พบ
num
ถ้าฉันทำอะไรเช่น SW tr
ถ้าฉันคลิกเรียกใช้
วิธีนี้ได้ผลเพราะมันไปตลอดห่วงโซ่การสืบทอดและจากนั้นไปถึงวัตถุฐาน
และอ็อบเจกต์ฐานมีสิ่งนี้จริง ๆ ดังนั้นมันจึงไม่ผิดพลาด
ใช่ คุณสามารถใช้สายดันเดอร์ได้
ตอนนี้.
ฉันพบตัวอย่างที่ดีที่นี่เพื่อแสดงให้คุณเห็นว่าเหตุใดการสืบทอดอาจสร้างความสับสนและเหตุใดสิ่งต่างๆ
เช่น Amro ที่คุณอาจต้องการหลีกเลี่ยงหรืออย่างน้อยก็ควรมีสติ
ลองคัดลอกรหัสนี้
และเอาทั้งหมดนี้
และเราจะเล่นเกมเล็ก ๆ
ตอนนี้ไวยากรณ์นี้
ดูเหมือนว่านี้
นี่คือแบบจำลองการสืบทอดของสิ่งที่เราเพิ่งสร้างขึ้น
ดูสับสนมากใช่มั้ย?
ดังนั้นถ้าเราทำที่นี่
และเราตรวจสอบ MRO หรือลำดับความละเอียดของเมธอดของ M
คุณคิดว่าคำสั่งจะเป็นอย่างไร?
หยุดวิดีโอชั่วคราวที่นี่แล้วลองเดาว่าลำดับจะเป็นอย่างไร
พร้อม.
มาทำ m dot amro กันเถอะ
และอีกอย่าง อีกวิธีในการทำเช่นนี้คือใช้ dunder amro แล้วมาพิมพ์กัน
เอาล่ะ มาเช็คกัน
อย่างแรกที่เรามีคือเอ็ม
ไม่เป็นไร?
เราตรวจเขา แล้วก็ตรวจ B เราตรวจ B เอาล่ะ
แล้วเราตรวจสอบ A.
เราตรวจสอบ A ที่นี่ แล้วเราตรวจสอบ x x ตรงนี้ แล้วก็ y
จากนั้น Z แล้วก็คลาสอ็อบเจ็กต์
นั่นคือสิ่งที่คุณคาดเดา?
มาดูโค้ดกัน
ทำไมถึงสั่งแบบนี้?
ลำดับนั้นเป็นเพราะวิธีที่เราส่งผ่านพารามิเตอร์ที่คุณเห็นว่าถูกส่งก่อน
A และ Z
นั่นหมายความว่าลำดับของ Maro จะเป็น a
แต่เดี๋ยวก่อนบีน่า
เมื่อกี้คืออะไร?
หลังจาก B และ A เรามีคลาส x
ทำไม X มาก่อน Z?
แทนที่จะไปที่ Z เรามาทำให้มันใหญ่ขึ้นหน่อย
แทนที่จะไปที่สิ่งที่เราคิดว่าจะเป็น Z มันจะไปที่ X จากนั้น Y จากนั้น Z แล้วก็วัตถุ
นี่เป็นเพราะอัลกอริธึมที่ใช้ทำ Miro ซึ่งเรียกว่าการค้นหาเชิงลึก
ตอนนี้มันอยู่นอกเหนือขอบเขตของหลักสูตร แต่อย่างที่คุณเห็น มันค่อนข้างสับสนเล็กน้อย
และตามจริงแล้ว Python ได้เปลี่ยนกฎ MISO จากสิ่งที่เราเคยมีใน Python เวอร์ชันที่อายุน้อยกว่า
นี่เป็นอีกสิ่งหนึ่งที่ได้รับการปรับปรุง
แต่เหตุผลที่ฉันแสดงให้คุณเห็นก็เพราะว่าคุณจะไม่ได้รับการทดสอบกับสิ่งนี้
หากคุณกำลังเขียนโค้ดโดยที่การสืบทอดมีลักษณะเช่นนี้ ฉันขอยืนยันว่าคุณกำลังเขียนโค้ดที่ไม่ถูกต้องเพราะมันซับซ้อนเกินไป
เรายังไม่ได้เขียนโค้ดใดๆ เลยในคลาสเหล่านี้ และมันก็ทำให้เกิดความสับสน
ดังนั้น Amro จึงมีวิธีการกำหนดลำดับที่คุณจะได้รับสืบทอด
และคุณสามารถใช้ฟังก์ชัน MRO หรือ DUNDAR เพื่อตรวจสอบสิ่งนี้ได้ตลอดเวลา
แต่เหตุผลที่ฉันนำมาที่นี่ไม่ใช่แค่พยายามทำให้คุณสับสน
เหตุผลก็คือว่ามันมีอยู่
อย่างไรก็ตาม คุณไม่ควรจัดโครงสร้างโค้ดของคุณในลักษณะนี้
นี่ไม่ได้หมายความว่าสิ่งนี้จะไม่เกิดขึ้นในป่า
ใช่.
แต่อย่างน้อยคุณมีวิธีตรวจสอบและอาจดีบั๊กโค้ดของคุณเมื่อคุณพบปัญหาเช่นนี้
ฉันจะฝากแหล่งข้อมูลเกี่ยวกับ Maro ไว้ให้คุณ
หากคุณสงสัยจริงๆ และต้องการเข้าใจจริงๆ ว่าอัลกอริทึมนี้ทำงานอย่างไร และลำดับนี้ถูกกำหนดอย่างไร
แต่ประเด็นสำคัญคือนี่คือวิธีที่ Python ทำงานเพื่อกำหนด เฮ้ เมื่อคุณเรียกใช้เมธอดหรือแอททริบิวต์
นี่คือวิธีที่ฉันจะค้นหาลำดับชั้นของมรดก
ไม่เป็นไร.
ถ้าสมองของคุณเจ็บอย่ากังวล
ของฉันก็เช่นกัน
หยุดพักแล้วเจอกันใหม่ในวิดีโอหน้า
ลาก่อน.