Tiếp tục lặp lại lời khuyên của Mike và Alex và thêm màu sắc của riêng tôi ...
Sử dụng các thuộc tính instance là một điển hình ... thì Python càng dễ hiểu. Thuộc tính lớp không được sử dụng nhiều, vì các trường hợp sử dụng của chúng là cụ thể. Điều này cũng đúng đối với phương thức tĩnh và phương thức lớp so với phương thức "bình thường". Chúng là các cấu trúc đặc biệt giải quyết các trường hợp sử dụng cụ thể, nếu không, đó là mã được tạo bởi một lập trình viên không ngoan muốn chứng tỏ rằng họ biết một số góc khuất của lập trình Python.
Alex đề cập trong câu trả lời của mình rằng truy cập sẽ nhanh hơn (một chút) do ít cấp độ tra cứu hơn ... hãy để tôi làm rõ thêm cho những người chưa biết về cách hoạt động của điều này. Nó rất giống với truy cập biến - thứ tự tìm kiếm là:
- dân địa phương
- người không định cư
- quả cầu
- tích hợp sẵn
Đối với quyền truy cập thuộc tính, thứ tự là:
- ví dụ
- lớp học
- các lớp cơ sở được xác định bởi MRO (thứ tự phân giải phương thức)
Cả hai kỹ thuật đều hoạt động theo cách "từ trong ra ngoài", có nghĩa là hầu hết các đối tượng cục bộ được kiểm tra đầu tiên, sau đó các lớp bên ngoài được kiểm tra liên tiếp.
Trong ví dụ của bạn ở trên, giả sử bạn đang tìm kiếm path
thuộc tính. Khi nó gặp một tham chiếu như " self.path
", Python sẽ xem xét các thuộc tính cá thể đầu tiên để tìm một kết quả phù hợp. Khi không thành công, nó sẽ kiểm tra lớp mà đối tượng được khởi tạo từ đó. Cuối cùng, nó sẽ tìm kiếm các lớp cơ sở. Như Alex đã nêu, nếu thuộc tính của bạn được tìm thấy trong trường hợp này, nó không cần phải tìm ở nơi khác, do đó bạn sẽ tiết kiệm được một chút thời gian.
Tuy nhiên, nếu bạn nhấn mạnh vào các thuộc tính của lớp, bạn cần phải tra cứu thêm. Hoặc , cách thay thế khác của bạn là tham chiếu đến đối tượng thông qua lớp thay vì đối tượng, ví dụ: MyController.path
thay vì self.path
. Đó là cách tra cứu trực tiếp sẽ xoay quanh quá trình tra cứu trì hoãn, nhưng như alex đề cập bên dưới, đó là một biến toàn cục, vì vậy bạn sẽ mất bit mà bạn nghĩ rằng bạn sẽ lưu (trừ khi bạn tạo một tham chiếu cục bộ cho tên lớp [global] ).
Điểm mấu chốt là bạn nên sử dụng các thuộc tính cá thể hầu hết thời gian. Tuy nhiên, sẽ có những trường hợp thuộc tính lớp là công cụ phù hợp cho công việc. Mã sử dụng cả hai cùng một lúc sẽ đòi hỏi sự siêng năng nhất, bởi vì việc sử dụng self
sẽ chỉ giúp bạn có được đối tượng thuộc tính cá thể và bóng đổ truy cập vào thuộc tính lớp có cùng tên. Trong trường hợp này, bạn phải sử dụng quyền truy cập thuộc tính theo tên lớp để tham chiếu đến nó.