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
   71   72   73   74   75   76   77   78   79   80   81