1) Tại sao được self
yêu cầu như một tham số rõ ràng trong chữ ký phương thức?
Bởi vì phương pháp là chức năng và foo.bar(baz)
chỉ là cú pháp đường cho bar(foo, baz)
. Các lớp chỉ là từ điển trong đó một số giá trị là các hàm. (Trình xây dựng cũng chỉ là các hàm, đó là lý do Python không cần new
) Bạn có thể nói rằng Python làm cho nó rõ ràng rằng các đối tượng được xây dựng từ các thành phần đơn giản hơn. Điều này phù hợp với triết lý "rõ ràng là tốt hơn ngầm".
Ngược lại, trong các đối tượng Java thực sự là ma thuật và không thể rút gọn thành các thành phần đơn giản hơn trong ngôn ngữ. Trong Java (ít nhất là cho đến Java 8), một hàm luôn là một phương thức thuộc sở hữu của một đối tượng và quyền sở hữu này không thể thay đổi do tính chất tĩnh của ngôn ngữ. Do đó, không có sự mơ hồ về những gì this
đề cập đến, vì vậy nó có ý nghĩa để nó được định nghĩa ngầm.
JavaScript là một ví dụ về ngôn ngữ có ẩn this
như Java, nhưng ở đó các hàm có thể tồn tại tách biệt với các đối tượng như trong Python. Điều này dẫn đến rất nhiều nhầm lẫn về những gì this
đề cập đến khi các chức năng được truyền qua và được gọi trong các bối cảnh khác nhau. Nhiều người nghĩ theo bản năng this
phải đề cập đến một số thuộc tính nội tại của hàm, trong khi nó thực sự được xác định hoàn toàn bằng cách gọi hàm. Tôi tin rằng việc có this
một tham số rõ ràng như trong Python sẽ làm cho điều này bớt khó hiểu hơn nhiều.
Một số lợi ích khác của tham số rõ ràng self
:
Trang trí chỉ là chức năng bao bọc các chức năng khác. Vì các phương thức chỉ là các hàm, các trình trang trí hoạt động tốt như các phương thức. Nếu có một số loại tự ẩn, các nhà trang trí sẽ không làm việc minh bạch trên các phương pháp.
Classmethods và phương thức tĩnh không lấy tham số thể hiện. Classmethods lấy một lớp làm đối số đầu tiên (thường được gọi là cls
). Các tham số rõ ràng self
hoặc cls
làm cho nó rõ ràng hơn những gì đang diễn ra và những gì bạn có quyền truy cập trong phương thức.
2) Tại sao các biến thể hiện luôn phải đủ tiêu chuẩn với " self.
?
Trong Java, bạn không cần phải thêm tiền tố vào các biến thành viên với " this.
", nhưng trong Python " self.
" luôn được yêu cầu. Lý do là Python không có cú pháp rõ ràng để khai báo các biến, vì vậy sẽ không có cách nào để biết liệu x = 7
có nên khai báo một biến cục bộ mới hay gán cho một biến thành viên hay không. Chỉ định self.
giải quyết sự mơ hồ này.