Khi nào nên sử dụng các phương thức riêng tư trong Python


9

Tôi có một lớp, nhưng mọi phương thức trong đó phải là riêng tư (ngoài hình thức __init____str__). Tôi có nên biểu thị mọi phương thức với dấu gạch dưới kép, hay đó được coi là thực hành xấu?


Tôi nghe nói rằng mọi thứ trong Python đều công khai và bạn nên tự tổ chức khi nào nên sử dụng chúng. Tôi không thực sự tham gia vào phần nâng cao của OO, nhưng đây là những gì còn lại trong tâm trí tôi về điều đó.
rồng

2
Chỉ cần FYI, xáo trộn tên được thiết kế để tránh va chạm với tên thường được sử dụng, không phải vì sự riêng tư.
gièm pha

Để trả lời chính xác câu trả lời của @detly: không phải "tên thường được sử dụng", mà là tên được sử dụng trong các lớp con. "Vì có một trường hợp sử dụng hợp lệ cho các thành viên lớp riêng (cụ thể là để tránh xung đột tên của các tên có tên được xác định bởi các lớp con), nên có sự hỗ trợ hạn chế cho một cơ chế như vậy, được gọi là xáo trộn tên." docs.python.org/3/tutorial/groupes.html#private-variables Để tránh va chạm với tên dựng sẵn, người ta sử dụng dấu gạch dưới (list_).
Yaroslav Nikitenko

Câu trả lời:


16

Các phương thức riêng tư thực sự - những phương thức không thể nhìn thấy hoặc được sử dụng từ bên ngoài một lớp - không tồn tại trong Python. Những gì chúng tôi có là những quy ước chỉ là những gợi ý để không chạm vào những thứ bạn không nên.

Gần nhất bạn có được sự riêng tư là xáo trộn tên. Một thuộc tính của MyClass có tên __some_attrsẽ chỉ được đổi tên thành _MyClass__some_attrbên trong, khiến cho việc tham chiếu nó từ bên ngoài lớp trở nên hơi khó xử. Điều này hiếm khi được sử dụng. Những gì hầu hết mọi người làm chỉ đơn giản là tiền tố một dấu gạch dưới ( _attr) như một ký hiệu rằng một cái gì đó không nên dựa vào & không phải là một phần của giao diện công cộng.

Sử dụng dấu gạch dưới kép trước và sau mã định danh, trong khi không bị cấm, được coi là dành riêng cho các chi tiết ngôn ngữ bên trong (như phương pháp 'ma thuật'). Bạn không nên đi xung quanh với những cái mới __attr__(trừ khi bạn hack người phiên dịch).


10
Những hướng dẫn này được ghi lại trong Pep 8 .
Brian

Điều gì về các trường hợp __some_attrsẽ không được tham chiếu ở bên ngoài lớp học? Sẽ không ổn nếu sử dụng hai dấu gạch dưới hàng đầu?
Nghịch lý Fermi

@ user5061 - về mặt kỹ thuật sử dụng đúng nhưng lại cau mày. Nó làm cho nội tâm khó khăn hơn.
Sean McS Something
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.