Truy cập trực tiếp một biến phiên bản so với sử dụng phương thức truy cập


80

Bất cứ ai có thể giải thích sự khác biệt giữa việc truy cập thuộc tính cá thể thông qua self.attributevà bằng cách @attribute?

Câu trả lời:


100

self.attributegọi phương thức attribute.
self.attribute = valuegọi phương thức attribute=với đối số value.
@attribute@attribute = valuelấy / đặt giá trị của biến cá thể @attribute.

Vì vậy, về cơ bản chúng là hai thứ hoàn toàn khác nhau.

Tuy nhiên, nếu bạn gọi attr_accessor :attributenó sẽ xác định phương thức attributetrả về @attributevà phương thức attribute=(value)để đặt @attribute = value. Vì vậy, trong trường hợp đó, không có sự khác biệt.


14
Lưu ý rằng nó thường được khuyến khích sử dụng self.(trừ khi bạn đang viết phương thức getter / setter) ngay cả khi bạn hiệnattr_accessor. Điều này bảo vệ bạn khỏi công việc tái cấu trúc bổ sung và các lỗi nếu sau này bạn thay đổi (các) phương thức của trình truy cập để làm nhiều việc hơn là chỉ lấy / đặt biến cá thể. (Hoặc nếu ai đó bản vá lỗi khác hoặc lớp con công việc của bạn.)
Phrogz

6
Một trong những lỗi mà Phrogz đang nói đến là nếu bạn chỉ đơn giản gọi thuộc tính = _____ thay vì self.attribute = ______ thì bạn đang đặt một biến cục bộ thay vì biến cá thể.
Jason Noble

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.