Như với tất cả các ví dụ hay, bạn đã đơn giản hóa những gì bạn đang thực sự làm. Điều này là tốt, nhưng điều đáng chú ý là python có rất nhiều tính linh hoạt khi nói đến lớp so với các biến thể hiện. Điều tương tự cũng có thể nói về phương pháp. Để có danh sách tốt các khả năng, tôi khuyên bạn nên đọc phần giới thiệu các lớp học theo phong cách mới của Michael Fötsch , đặc biệt là các phần từ 2 đến 6.
Một điều cần rất nhiều công việc cần nhớ khi bắt đầu là python không phải là java. Không chỉ là một sáo ngữ. Trong java, toàn bộ một lớp được biên dịch, làm cho độ phân giải không gian tên thực sự đơn giản: bất kỳ biến nào được khai báo bên ngoài một phương thức (bất cứ nơi nào) đều là các biến thể (hoặc, nếu tĩnh, lớp) và có thể truy cập ngầm trong các phương thức.
Với python, quy tắc lớn là có ba không gian tên được tìm kiếm theo thứ tự cho các biến:
- Hàm / phương thức
- Các mô-đun hiện tại
- Nội địa
{begin pedagogy}
Có những ngoại lệ hạn chế cho điều này. Cái chính xảy ra với tôi là, khi một định nghĩa lớp đang được tải, định nghĩa lớp là không gian tên ẩn của chính nó. Nhưng điều này chỉ tồn tại chừng nào mô-đun đang được tải và hoàn toàn bị bỏ qua khi trong một phương thức. Như vậy:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
nhưng:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
Cuối cùng, điều cần nhớ là bạn làm được tiếp cận với bất kỳ của các biến mà bạn muốn truy cập, nhưng có lẽ không ngầm. Nếu mục tiêu của bạn đơn giản và dễ hiểu, thì việc tìm kiếm Foo.bar hoặc self.bar có thể là đủ. Nếu ví dụ của bạn trở nên phức tạp hơn hoặc bạn muốn làm những việc ưa thích như thừa kế (bạn có thể kế thừa các phương thức tĩnh / lớp!) Hoặc ý tưởng đề cập đến tên của lớp trong chính lớp đó có vẻ sai với bạn, hãy kiểm tra phần giới thiệu tôi liên kết.