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