2010-03-09 13 views
32

Cách nào ưu tiên xác định thuộc tính lớp trong Python và tại sao? Có Ok để sử dụng cả hai trong một lớp học?Cách ưa thích để xác định các thuộc tính trong Python: trình trang trí đặc tính hoặc lambda?

@property 
def total(self): 
    return self.field_1 + self.field_2 

hoặc

total = property(lambda self: self.field_1 + self.field_2) 
+1

Bạn đã thấy "tài sản qua lambda" ở đâu mà có thể khiến bạn nghĩ rằng nó có thể "ưa thích"? Bạn có thấy nhiều thứ này không? Nếu vậy, ở đâu? –

+0

@ S.Lott Một số cuốn sách python, tôi không nhớ. Tôi sẽ sử dụng trang trí từ bây giờ. Không vấn đề gì. :-) – parxier

Trả lời

21

Hình thức trang trí có lẽ là tốt nhất trong trường hợp bạn đã thể hiện, nơi bạn muốn để biến phương pháp này thành một thuộc tính chỉ đọc. Trường hợp thứ hai là tốt hơn khi bạn muốn cung cấp một setter/deleter/docstring cũng như getter hoặc nếu bạn muốn thêm một thuộc tính có tên khác với phương thức nó lấy được giá trị của nó.

+10

+1: Vui lòng không sử dụng lambdas. Xin vui lòng. –

+28

S.Lott - tại sao không? (Không cãi nhau - chỉ tò mò) – Yarin

+0

@ S.Lott: ok nhưng cách giải quyết của bạn đối với giới hạn của lambdas không cho phép docstrings là gì? – smci

4

Không sử dụng lambdas cho việc này. Việc đầu tiên là chấp nhận được cho một tài sản chỉ đọc, thứ hai được sử dụng với phương pháp thực sự cho các trường hợp phức tạp hơn.

49

Đối với tài sản chỉ đọc tôi sử dụng trang trí, khác tôi thường làm một cái gì đó như thế này:

class Bla(object): 
    def sneaky(): 
     def fget(self): 
      return self._sneaky 
     def fset(self, value): 
      self._sneaky = value 
     return locals() 
    sneaky = property(**sneaky()) 

update:

các phiên bản gần đây của python tăng cường phương pháp trang trí:

class Bla(object): 
    @property 
    def elegant(self): 
     return self._elegant 

    @elegant.setter 
    def elegant(self, value): 
     self._elegant = value 
+2

Tôi gặp lỗi khi sử dụng flake8, pyflakes khi sử dụng ký pháp này. Tôi được xác định lại các cảnh báo chức năng 'tao nhã'. – Stephan

+0

Với Pylint, có một lợi ích bổ sung để sử dụng trang trí. Xem [Cảnh báo Pylint 'W0212' với các thuộc tính truy cập vào thành viên được bảo vệ: cách tránh?] (Http://stackoverflow.com/questions/24833362/pylint-warning-w0212-with-properties-accessing-a-protected-member- how-to-avoi). Nó bảo tồn khả năng của Pylint để kiểm tra giá trị trả về/đối tượng. – Hibou57

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