Page 74 - Python Simple
P. 74

9. Lớp                                                          http://www.vithon.org/tutorial/2.5/node11.html



             là đối tượng đó được truyền vào ở thông số đầu tiên của hàm. Trong ví dụ của chúng
             ta, lời gọi x.f() hoàn toàn tương đương với MyClass.f(x). Nói chung, gọi một hàm
             với một danh sách n thông số thì tương đương với việc gọi hàm tương ứng với một
             danh sách thông số được tạo ra bằng cách chèn đối tượng của phương thức vào trước
             thông số thứ nhất.

             (Hiểu đơn giản là obj.name(arg1, arg2) tương đương với Class.name(obj, arg1,
             arg2) trong đó obj là đối tượng trường hợp của lớp Class, name là một thuộc tính hợp
             lệ không phải dữ liệu, tức là đối tượng hàm của lớp đó.)


             9.4 Một vài lời bình



             Thuộc tính dữ liệu sẽ che thuộc tính phương thức cùng tên; để tránh vô tình trùng lặp
             tên, mà có thể dẫn đến các lỗi rất khó tìm ra trong các chương trình lớn, bạn nên có
             một quy định đặt tên nào đó để giảm thiểu tỉ lệ trùng lặp. Các quy định khả thi có thể
             gồm viết hoa tên phương thức, đặt tiền tố vào các tên thuộc tính dữ liệu (ví dụ như dấu
             gạch dưới _), hoặc dùng động từ cho phương thức và danh từ cho các thuộc tính dữ
             liệu.

             Các thuộc tính dữ liệu có thể được tham chiếu tới bởi cả phương thức lẫn người dùng
             đối tượng đó. Nói một cách khác, lớp không thể được dùng để cài đặt các kiểu dữ liệu
             trừu tượng tuyệt đối. Trong thực tế, không có gì trong Python có thể ép việc che dấu
             dữ liệu -- tất cả đều dựa trên nguyên tắc. (Mặt khác, cài đặt Python, được viết bằng C,
             có thể dấu các chi tiết cài đặt và điểu khiển truy cập vào một đối tượng nếu cần; điều
             này có thể được dùng trong các bộ mở rộng Python viết bằng C.)

             Người dùng nên dùng các thuộc tính dữ liệu một cách cẩn thận -- người dùng có thể
             phá hỏng những bất biến (invariant) được giữ bởi các phương thức nếu cố ý sửa các
             thuộc tính dữ liệu. Lưu ý rằng người dùng có thể thêm các thuộc tính dữ liệu riêng
             của hộ vào đối tượng trường hợp mà không làm ảnh hưởng tính hợp lệ của các phương
             thức, miễn là không có trùng lặp tên -- xin nhắc lại, một quy tắc đặt tên có thể giảm
             bớt sự đau đầu ở đây.


             Không có cách ngắn gọn để tham chiếu tới thuộc tính dữ liệu (hoặc các phương thức
             khác!) từ trong phương thức. Điều này thật ra giúp chúng ta dễ đọc mã vì không có sự
             lẫn lộn giữa biến nội bộ và biến trường hợp.

             Thông số đầu tiên của phương thức thường được gọi là self. Đây cũng chỉ là một quy
             ước: tên self hoàn toàn không có ý nghĩa đặc biệt trong Python. (Tuy nhiên xin nhớ
             nếu bạn không theo quy ước thì mã của bạn sẽ có thể trở nên khó đọc đối với người
             khác, và có thể là trình duyệt lớp được viết dựa trên những quy ước như vậy.)

             Bất kỳ đối tượng hàm nào mà là thuộc tính của một lớp sẽ định nghĩa một phương
             thức cho các trường hợp của lớp đó. Không nhất thiết định nghĩa hàm phải nằm trong
             định nghĩa lớp trên văn bản: gán một đối tượng hàm vào một biến nội bộ trong lớp
             cũng được. Ví dụ:

                 # Function defined outside the class
                 def f1(self, x, y):
                     return min(x, x+y)

                 class C:





     6 of 13                                                                                  08/31/2011 10:27 AM
   69   70   71   72   73   74   75   76   77   78   79