Tất cả các giải thích có thể được tìm thấy trong Tài liệu Python Hướng dẫn Python
Đối với lỗi đầu tiên của bạn <type 'exceptions.NameError'>: name 'outer_var' is not defined
. Lời giải thích là:
Không có cách viết tắt để tham chiếu các thuộc tính dữ liệu (hoặc các phương thức khác!) Từ bên trong các phương thức. Tôi thấy rằng điều này thực sự làm tăng khả năng đọc của các phương thức: không có khả năng nhầm lẫn giữa các biến cục bộ và biến phiên bản khi xem qua một phương thức.
được trích dẫn từ Hướng dẫn Python 9.4
Đối với lỗi thứ hai của bạn <type 'exceptions.NameError'>: name 'OuterClass' is not defined
Khi một định nghĩa lớp được để lại bình thường (thông qua phần cuối), một đối tượng lớp được tạo.
được trích dẫn từ Hướng dẫn Python 9.3.1
Vì vậy, khi bạn thử inner_var = Outerclass.outer_var
, nó Quterclass
vẫn chưa được tạo, đó là lý do tại saoname 'OuterClass' is not defined
Một lời giải thích chi tiết hơn nhưng tẻ nhạt cho lỗi đầu tiên của bạn:
Mặc dù các lớp có quyền truy cập vào phạm vi bao gồm các hàm, tuy nhiên, chúng không hoạt động như các phạm vi bao quanh đối với mã được lồng trong lớp: Python tìm kiếm các hàm bao quanh cho các tên được tham chiếu, nhưng không bao giờ có bất kỳ lớp bao quanh nào. Nghĩa là, một lớp là một phạm vi cục bộ và có quyền truy cập để bao quanh các phạm vi cục bộ, nhưng nó không đóng vai trò là một phạm vi cục bộ bao quanh cho mã lồng nhau.
trích dẫn từ Learning.Python (thứ 5) .Mark.Lutz