2011-09-30 20 views
7

Tôi đã thấy mã trong đó các hàm/hằng số được bắt đầu bằng dấu gạch dưới. Sự hiểu biết của tôi là điều này cho thấy rằng chúng không được sử dụng trực tiếp. Tôi có thể làm điều này với các lớp học không?Có phải là quy ước để đặt tiền tố cho các lớp riêng với dấu gạch dưới không?

class _Foo(object): 
    pass 

class __Bar(object): 
    pass 
+3

'__' được đặt trước bởi Python. Đừng bao giờ sử dụng điều này. Nó dẫn đến các vấn đề với mangling tên trong hầu hết các trường hợp. Cố gắng tránh suy nghĩ về điều này là hữu ích. Hãy thử nghĩ về điều này là "dành riêng" và "không dùng chung" và "một vấn đề đang chờ xảy ra". Và sau đó, hãy lấy nó ra khỏi câu hỏi của bạn. –

+0

Vui lòng giải thích một lớp "riêng tư" có thể là gì. Bạn có thể cung cấp một trường hợp sử dụng hoặc một tình huống mà bạn sẽ sử dụng này? –

+0

Sẽ có các chức năng được xuất mà người dùng nên sử dụng. Trong các hàm này, nó sẽ khởi tạo các lớp "riêng tư" này. – canadadry

Trả lời

6

Chỉ sử dụng tốt hơn một _. Điều này cho biết rằng tên là riêng tư trong một mô-đun.

Nó không được nhập với phần bắt giữ tất cả from <module> import * và có một số tính năng khác như "phá hủy ưu tiên".

Từ here:

Nếu __all__ không được định nghĩa, các thiết lập của tên công bao gồm tất cả các tên tìm thấy trong không gian tên của mô-đun mà không bắt đầu bằng một dấu gạch dưới ký tự ('_').

Từ here:

Bắt đầu với phiên bản 1.5, Python đảm bảo rằng globals có tên bắt đầu bằng một dấu gạch dưới đơn sẽ bị xóa khỏi mô-đun của họ trước khi globals khác sẽ bị xóa.

Hai dấu gạch dưới là thành viên lớp bắt đầu là name-mangled.

5

Có; việc sử dụng dấu gạch dưới đơn được PEP8 xác nhận cho các lớp sử dụng nội bộ.

Tôi không tin rằng việc sử dụng dấu gạch dưới đôi sẽ có bất kỳ ảnh hưởng thực nào, vì nó được sử dụng để mang tên đang hoạt động cho thuộc tính lớp, và nói chung một lớp không phải là thuộc tính của lớp khác (được cấp, nó có thể là, trong trường hợp đó Python sẽ mang tên đó cho bạn.)

2

Bạn có thể sử dụng dấu gạch dưới làm ký tự đầu tiên trong bất kỳ biến nào, nhưng nó mang ý nghĩa ngụ ý, "Không sử dụng bên ngoài lớp/mô-đun trừ khi bạn thực sự biết những gì bạn đang làm "(ví dụ như dự định được bảo vệ/nội bộ) và nó sẽ không nhập nếu bạn sử dụng from <module> import *.

Sử dụng dấu gạch dưới kép là thứ bạn không bao giờ nên làm bên ngoài lớp vì nó có thể gây rối với tên mangling khác (và "có thể", ý tôi là "khiến tôi đau đầu trong tuần vừa qua vì tôi không nhận ra rằng nó ").

2

Có, và đây không chỉ là một quy ước. Khi bạn import * từ mô-đun này, tên bắt đầu bằng dấu gạch dưới sẽ không được nhập.

+1

Xem câu trả lời của glglgl - chỉ khi '__all__' không được xác định. Bạn có thể bao gồm gạch dưới tên tiền tố trong '__all__' nếu bạn muốn. – agf

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