2013-02-07 18 views
6

Tôi chỉ đọc bài How can I assign a new class attribute via __dict__ in python? và đã có một bình luận từ @bruno desthuilliers nói:setattr (đối tượng, tên, giá trị) vs đối tượng .__ setattr __ (tên, giá trị)

Chúng ta không nên trực tiếp gọi kỳ diệu các phương thức - chúng ở đây khi triển khai các toán tử hoặc các hàm chung. Trong trường hợp này, giải pháp thành ngữ là sử dụng setattr(obj, name, value).

Trường hợp của setattr có vẻ nằm ngoài phạm vi nhận xét của riêng mình: không phải là toán tử, không thực sự thực hiện chức năng chung.

Ai đó có thể giải thích nhận xét? Tại sao tôi nên thích cái này hơn cái kia?

Trường hợp nào thích hợp hơn khi sử dụng obj.__setattr__(name, value)?

Trả lời

15

Bạn nên luôn sử dụng setattr(), người nhận xét khá chính xác.

Không phải tất cả các loại đều triển khai __setattr__, ví dụ: setattr() sẽ hoạt động chính xác nếu loại cho phép thuộc tính được đặt.

Phương thức đôi gạch dưới là móc, ở đó để cho phép các lớp tùy chỉnh của bạn triển khai hành vi tùy chỉnh. Các API Python sẽ sử dụng các móc này nếu có, để trở về hành vi mặc định nếu móc bị thiếu. Bằng cách bỏ qua API, bạn đang gánh nặng bản thân với việc phải triển khai dự phòng trong mã của riêng bạn.

Bạn chỉ bao giờ cần phải gọi __setattr__ trực tiếp khi thực hiện một lớp con, và sau đó tốt nhất là thông qua các super() gọi:

def Foo(Bar): 
    def __setattr__(self, attr, value): 
     # do something with attr and value 
     super(Foo, self).__setattr__(attr, value) 
+0

nhờ @Martijn câu trả lời tuyệt vời –

Các vấn đề liên quan