สะท้อนคำแนะนำของ MikeและAlex เพิ่มเติมและเพิ่มสีของตัวเอง ...
การใช้แอตทริบิวต์อินสแตนซ์เป็นเรื่องปกติ ... ยิ่ง Python สำนวนมากขึ้น แอตทริบิวต์คลาสไม่ได้ใช้มากนักเนื่องจากกรณีการใช้งานมีความเฉพาะเจาะจง เช่นเดียวกับวิธีการแบบคงที่และคลาสเทียบกับเมธอด "ปกติ" โครงสร้างเหล่านี้เป็นโครงสร้างพิเศษสำหรับกรณีการใช้งานที่เฉพาะเจาะจงไม่เช่นนั้นก็เป็นรหัสที่สร้างขึ้นโดยโปรแกรมเมอร์ที่ผิดปกติที่ต้องการแสดงให้เห็นว่าพวกเขารู้มุมที่คลุมเครือของการเขียนโปรแกรม Python
อเล็กซ์กล่าวในคำตอบของเขาว่าการเข้าถึงจะเร็วขึ้น (เล็กน้อย) เนื่องจากการค้นหาที่น้อยกว่าหนึ่งระดับ ... ขอฉันชี้แจงเพิ่มเติมสำหรับผู้ที่ยังไม่รู้เกี่ยวกับวิธีการทำงาน คล้ายกับการเข้าถึงตัวแปร - ลำดับการค้นหาคือ:
- ชาวบ้าน
- nonlocals
- Globals
- สร้างอิน
สำหรับการเข้าถึงแอตทริบิวต์ลำดับคือ:
- ตัวอย่าง
- ชั้น
- คลาสพื้นฐานตามที่กำหนดโดยMRO (ลำดับวิธีการแก้ปัญหา)
เทคนิคทั้งสองทำงานในลักษณะ "ภายใน - ภายนอก" ซึ่งหมายความว่าจะมีการตรวจสอบวัตถุในพื้นที่มากที่สุดก่อนจากนั้นจึงตรวจสอบชั้นนอกตามลำดับ
ในตัวอย่างของคุณด้านบนสมมติว่าคุณกำลังค้นหาpath
แอตทริบิวต์ เมื่อพบการอ้างอิงเช่น " self.path
" Python จะดูแอตทริบิวต์อินสแตนซ์ก่อนสำหรับการจับคู่ เมื่อล้มเหลวจะตรวจสอบคลาสที่อ็อบเจ็กต์ถูกสร้างอินสแตนซ์ สุดท้ายมันจะค้นหาคลาสพื้นฐาน ดังที่อเล็กซ์กล่าวไว้หากพบแอตทริบิวต์ของคุณในอินสแตนซ์ก็ไม่จำเป็นต้องมองหาที่อื่นดังนั้นคุณจึงประหยัดเวลาได้เล็กน้อย
อย่างไรก็ตามหากคุณยืนยันในแอตทริบิวต์คลาสคุณต้องมีการค้นหาเพิ่มเติม หรือทางเลือกอื่น ๆ ของคุณคือการอ้างถึงวัตถุที่ผ่านการเรียนแทนตัวอย่างเช่นแทนMyController.path
self.path
นั่นคือการค้นหาโดยตรงซึ่งจะได้รับการค้นหาที่รอการตัดบัญชี แต่ตามที่ alex กล่าวถึงด้านล่างนี้เป็นตัวแปรส่วนกลางดังนั้นคุณจึงสูญเสียบิตที่คุณคิดว่าจะบันทึก (เว้นแต่คุณจะสร้างการอ้างอิงในท้องถิ่นไปยังชื่อคลาส [global] )
สิ่งสำคัญที่สุดคือคุณควรใช้แอตทริบิวต์อินสแตนซ์เกือบตลอดเวลา อย่างไรก็ตามจะมีบางครั้งที่แอตทริบิวต์คลาสเป็นเครื่องมือที่เหมาะสมสำหรับงาน โค้ดที่ใช้ทั้งสองอย่างพร้อมกันจะต้องใช้ความรอบคอบมากที่สุดเนื่องจากการใช้self
จะทำให้คุณได้รับอินสแตนซ์แอ็ตทริบิวต์ออบเจ็กต์และเงาเท่านั้นที่เข้าถึงแอตทริบิวต์คลาสที่มีชื่อเดียวกัน ในกรณีนี้คุณต้องใช้การเข้าถึงแอตทริบิวต์โดยใช้ชื่อคลาสเพื่ออ้างอิง