2008-12-17 33 views
9

Trong thuộc tính Python được sử dụng thay cho getters, setters kiểu Java. Vì vậy, một trong những hiếm khi thấy có được ... hoặc thiết lập .. phương pháp trong giao diện công cộng của các lớp học.Tôi có nên sử dụng tiền tố get_/set_ trong tên phương thức Python không?

Nhưng trong trường hợp là tài sản không thích hợp, người ta vẫn có thể kết thúc bằng các phương pháp hoạt động như getters hoặc setters. Bây giờ câu hỏi của tôi: Những tên phương pháp này có bắt đầu bằng get_/set_ không? Hay là sự vần điệu độc ác này vì nó thường là điều hiển nhiên (và người ta vẫn có thể sử dụng docstring để làm rõ các tình huống không rõ ràng)?

Đây có thể là vấn đề về sở thích cá nhân, nhưng tôi sẽ quan tâm đến điều mà phần lớn nghĩ về điều này? Bạn thích điều gì hơn với tư cách là người dùng API?

Ví dụ: Giả sử chúng tôi có đối tượng đại diện cho nhiều thành phố. Người ta có thể có một phương pháp get_city_by_postalcode(postalcode) hoặc người ta có thể sử dụng tên ngắn hơn city_by_postalcode. Tôi có khuynh hướng về sau.

+0

"trường hợp là một tài sản là không thích hợp" gặp rắc rối với điều này. Một ví dụ sẽ giúp ích. Thuộc tính rất hữu ích thật khó để tưởng tượng bất kỳ nơi nào mà chúng không phù hợp. –

+0

@ S.Lott: Còn về ví dụ tôi đã cung cấp? Nó không phải là một getter theo nghĩa thông thường, nhưng 'get' có thể là động từ phù hợp nhất. – nikow

Trả lời

2

Tôi nghĩ ngắn hơn là tốt hơn, vì vậy tôi có xu hướng thích sau này. Nhưng điều quan trọng là phù hợp với dự án của bạn: không trộn lẫn hai phương pháp. Nếu bạn nhảy vào dự án của người khác, hãy giữ những gì các nhà phát triển khác chọn ban đầu.

1

Tôi đã nhìn thấy nó được thực hiện theo cả hai cách. Đến từ một nền Objective-C, tôi thường làm foo()/set_foo() nếu tôi không thể sử dụng một thuộc tính (mặc dù tôi cố gắng sử dụng các thuộc tính bất cứ khi nào có thể). Tuy nhiên, điều này thực sự không quan trọng lắm, chỉ cần miễn là bạn nhất quán.

(Tất nhiên, trong ví dụ của bạn, tôi sẽ không gọi phương thức get_city_by_postalcode() ở tất cả, tôi có thể đi với translate_postalcode hoặc một cái gì đó tương tự mà sử dụng một hành động tốt hơn động từ trong tên.)

+3

Thực ra, tôi nghĩ "get_city_by_postalcode" có nhiều tính mô tả hơn "translate_postalcode". –

5

Bạn thắng không bao giờ mất cơ hội để làm cho tài sản của bạn cư xử như một getter/setter sau này bằng cách sử dụng descriptors. Nếu bạn muốn thay đổi thuộc tính chỉ đọc, bạn cũng có thể thay thế nó bằng phương thức getter có cùng tên với thuộc tính và trang trí nó bằng @property. Vì vậy, lời khuyên của tôi là tránh getters/setters trừ khi dự án bạn đang làm việc đã sử dụng chúng, bởi vì bạn luôn có thể thay đổi ý định của mình sau này và tạo các thuộc tính chỉ đọc, chỉ ghi hoặc bất cứ điều gì mà không sửa đổi giao diện cho lớp của bạn.

4

Nếu đó là có thể sử dụng như một tài sản (một giá trị để có được hoặc được thiết lập, và không có các thông số khác, tôi thường làm:

class Foo(object): 

    def _get_x(self): 
     pass 

    def _set_x(self, value): 
     pass 

    x = property(_get_x, _set_x) 

Nếu getter/setter là bất kỳ phức tạp hơn thế nữa, tôi sẽ sử dụng get_x và set_x:

0

Nếu tôi phải sử dụng một getter/setter, tôi thích nó theo cách này:

Giả sử bạn có một self._x biến Sau đó x() sẽ trả về giá trị của self._x, và. setX (x) sẽ đặt giá trị của self._x

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