คำอธิบายทั้งหมดสามารถพบได้ในPython Documentation The Python Tutorial
<type 'exceptions.NameError'>: name 'outer_var' is not defined
สำหรับข้อผิดพลาดครั้งแรกของคุณ คำอธิบายคือ:
ไม่มีชวเลขสำหรับอ้างอิงแอตทริบิวต์ข้อมูล (หรือวิธีการอื่น ๆ !) จากภายในวิธีการ ฉันพบว่าสิ่งนี้ช่วยเพิ่มความสามารถในการอ่านเมธอด: ไม่มีโอกาสที่จะทำให้ตัวแปรโลคัลและตัวแปรอินสแตนซ์สับสนเมื่อมองผ่านเมธอด
ยกมาจากThe Python Tutorial 9.4
สำหรับข้อผิดพลาดที่สองของคุณ <type 'exceptions.NameError'>: name 'OuterClass' is not defined
เมื่อนิยามคลาสถูกปล่อยทิ้งไว้ตามปกติ (ผ่านส่วนท้าย) คลาสอ็อบเจ็กต์จะถูกสร้างขึ้น
ยกมาจากThe Python Tutorial 9.3.1
ดังนั้นเมื่อคุณลองinner_var = Outerclass.outer_var
แล้วQuterclass
ยังไม่ได้สร้างนั่นคือเหตุผลname 'OuterClass' is not defined
คำอธิบายที่ละเอียดกว่า แต่น่าเบื่อสำหรับข้อผิดพลาดแรกของคุณ:
แม้ว่าคลาสจะสามารถเข้าถึงขอบเขตของฟังก์ชันที่ปิดล้อมได้ แต่ก็ไม่ได้ทำหน้าที่ปิดขอบเขตขอบเขตของโค้ดที่ซ้อนอยู่ภายในคลาส: Python ค้นหาฟังก์ชันที่ปิดล้อมสำหรับชื่อที่อ้างอิง แต่ไม่เคยปิดคลาสใด ๆ นั่นคือคลาสเป็นขอบเขตแบบโลคัลและสามารถเข้าถึงการปิดขอบเขตโลคัลได้ แต่ไม่ได้ทำหน้าที่เป็นขอบเขตโลคัลที่ปิดล้อมเพื่อโค้ดที่ซ้อนกันเพิ่มเติม
อ้างจากLearning.Python (5th) .Mark.Lutz