Page 76 - Python Simple
P. 76
9. Lớp http://www.vithon.org/tutorial/2.5/node11.html
tạo một trường hợp của lớp. Các tham chiếu hàm được giải như sau: thuộc tính lớp
tương ứng sẽ được tìm, đi xuống chuỗi các lớp cơ sở nếu cần, và tham chiếu phương
thức là hợp lệ nếu tìm thấy một đối tượng hàm.
Lớp con có thể định nghĩa lại các phương thức của lớp cơ sở. Bởi vì phương thức không
có quyền gì đặc biệt khi gọi một phương thức của cùng một đối tượng, một phương
thức của lớp cơ sở gọi một phương thức khác được định nghĩa trong cùng lớp cơ sở có
thể là đang gọi một phương thức do lớp con đã định nghĩa lại. (Người dùng C++ có
thể hiểu là mọi phương thức của Python là virtual.)
Một phương thức được định nghĩa lại trong lớp con có thể muốn mở rộng thay vì thay
thế phương thức cùng tên của lớp cơ sở. Có một cách đơn giản để gọi phương thức của
lớp sơ sở: chỉ việc gọi "BaseClassName.methodname(self, arguments)". Đôi khi điều
này cũng có ích cho người dùng. (Lưu ý rằng đoạn mã chỉ hoạt động nếu lớp cơ sở
được định nghĩa hoặc nhập trực tiếp vào phạm vi toàn cục.)
9.5.1 Đa kế thừa
Python cũng hỗ trợ một dạng đa kế thừa hạn chế. Một định nghĩa lớp với nhiều lớp cơ
sở có dạng sau:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
Luật duy nhất cần để giải thích ý nghĩa là luật giải các tham chiếu thuộc tính của lớp.
Nó tuân theo luật tìm theo chiều sâu, và tìm trái qua phải. Do đó, nếu một thuộc tính
không được tìm ra trong DerivedClassName, nó sẽ được tìm trong Base1, rồi (đệ quy)
trong các lớp cơ sở của Base1, rồi chỉ khi nó không được tìm thấy, nó sẽ được tìm
trong Base2, và cứ như vậy.
(Đối với một số người tìm theo chiều rộng -- tìm Base2 và Base3 trước các lớp cơ sở của
Base1 -- có vẻ tự nhiên hơn. Nhưng, điều này yêu cầu bạn biết một thuộc tính nào đó
của Base1 được thật sự định nghĩa trong Base1 hay trong một trong các lớp cơ sở của
nó trước khi bạn có thể biết được hậu quả của sự trùng lặp tên với một thuộc tính của
Base2. Luật tìm theo chiều sâu không phân biệt giữa thuộc tính trực tiếp hay kế thừa
của Base1.)
Ai cũng biết rằng việc dùng đa kế thừa bừa bãi là một cơn ác mộng cho bảo trì, đặc
biệt là Python dựa vào quy ước để tránh trùng lặp tên. Một vấn đề cơ bản với đa kế
thừa là một lớp con của hai lớp mà có cùng một lớp cơ sở. Mặc dù dễ hiểu chuyện gì
xảy ra trong vấn đề này (trường hợp sẽ có một bản chép duy nhất của ``các biến
trường hợp'' của các thuộc tính dữ liệu dùng bởi lớp cơ sở chung), nó không rõ cho
lắm nếu các ý nghĩa này thật sự hữu ích.
9.6 Biến riêng
Có một dạng hỗ trợ nho nhỏ nho các từ định danh riêng của lớp (class-private
identifier). Các từ định danh có dạng __spam (ít nhất hai dấu gạch dưới ở đầu, nhiều
8 of 13 08/31/2011 10:27 AM