2010-08-02 37 views
62

thể trùng lặp:
The meaning of a single- and a double-underscore before an object name in PythonPrivate biến và phương pháp trong Python

nào tôi nên sử dụng _foo (một dấu gạch dưới) hoặc __bar (gạch kép) cho các thành viên tư nhân và phương pháp trong Python?

+1

Cảm ơn tất cả. Tôi tìm thấy một chủ đề hữu ích. http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private – kurikintoki

+1

Tốt hơn: http://stackoverflow.com/questions/1301346/the-meaning-of-a- single-and-a-double-underscore-before-an-object-name-in-python – laffuste

Trả lời

33

Dấu gạch dưới kép. Nó mang theo tên theo cách mà nó không thể được truy cập chỉ đơn giản thông qua __fieldName từ bên ngoài lớp học, đó là những gì bạn muốn bắt đầu nếu chúng được riêng tư. (Mặc dù vẫn không khó để truy cập vào trường này.)

class Foo: 
    def __init__(self): 
     self.__privateField = 4; 
     print self.__privateField # yields 4 no problem 

foo = Foo() 
foo.__privateField 
# AttributeError: Foo instance has no attribute '__privateField' 

Thay vào đó, bạn có thể truy cập thông qua _Foo__privateField. Nhưng nó hét lên "TÔI KHÔNG TƯ NHÂN KHÔNG TOUCH ME", mà là tốt hơn không có gì.

64

Xin lưu ý rằng không có điều gì là "phương thức riêng tư" bằng Python. gạch dưới đôi chỉ là tên mangling:

>>> class A(object): 
...  def __foo(self): 
...   pass 
... 
>>> a = A() 
>>> A.__dict__.keys() 
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__'] 
>>> a._A__foo() 

Vì vậy, do đó __ tiền tố rất hữu ích khi bạn cần mangling xảy ra, ví dụ để không xung đột với tên lên hoặc dưới chuỗi thừa kế. Đối với các ứng dụng khác, dấu gạch dưới đơn sẽ tốt hơn, IMHO.

EDIT, liên quan đến sự nhầm lẫn trên __, PEP-8 là khá rõ ràng về điều đó:

Nếu lớp học của bạn được thiết kế để được subclassed, và bạn có các thuộc tính mà bạn không muốn lớp con để sử dụng, xem xét đặt tên cho chúng với dấu gạch dưới kép và không có dấu gạch dưới. Điều này gọi ra Thuật toán mang tên của Python, trong đó tên của lớp là bị cắt xén thành tên thuộc tính. Điều này giúp tránh tên thuộc tính va chạm nên các lớp con vô tình chứa các thuộc tính với tên cùng một tên là .

Lưu ý 3: Không phải ai cũng thích mangling name. Hãy cố gắng cân bằng số cần tránh các xung đột tên ngẫu nhiên với khả năng sử dụng tiềm năng của người gọi nâng cao.

Vì vậy, nếu bạn không mong đợi lớp con vô tình xác định lại phương thức riêng có cùng tên, không sử dụng nó.

9

Dấu gạch dưới kép. Đó là mangles tên. Biến vẫn có thể được truy cập, nhưng thường là một ý tưởng tồi để làm như vậy.

Sử dụng dấu gạch dưới đơn cho bán riêng tư (cho các nhà phát triển python "chỉ thay đổi điều này nếu bạn tuyệt đối phải") và tăng gấp đôi cho riêng tư hoàn toàn.

+7

Không hoàn toàn đúng.Một dấu gạch dưới đơn có nghĩa là bạn đang giả mạo các thuộc tính không có giấy tờ của một đối tượng có thể thay đổi và bạn cũng có thể phá vỡ các bất biến được duy trì bởi đối tượng để bạn hiểu chính xác những gì bạn đang làm nếu bạn quyết định ngắt đóng gói đối tượng. – msw

-3

Do quy ước mã hóa thats. Xem here để biết thêm.

+4

OP đã yêu cầu sử dụng cái nào. Tại sao không. – Ponkadoodle

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