2013-02-23 36 views
41

Khi viết mô-đun python và các chức năng trong nó, tôi có một số chức năng "công khai" được cho là tiếp xúc với bên ngoài, nhưng một số chức năng "riêng tư" khác chỉ được xem và được sử dụng cục bộ và nội bộ.Quy ước mã hóa chức năng "riêng" của Python

Tôi hiểu trong python không có hàm riêng tư tuyệt đối. Nhưng cách tốt nhất, gọn gàng nhất hoặc được sử dụng nhiều nhất để phân biệt các chức năng "công khai" và "riêng tư" là gì?

tôi liệt kê một số các phong cách tôi biết:

  1. sử dụng __all__ trong tập tin mô-đun để chỉ "công cộng" của nó chức năng (What's the python __all__ module level variable for?)
  2. sử dụng nhấn vào đầu tên của chức năng "private"

Có ý tưởng hay quy ước nào khác mà mọi người sử dụng không?

Cảm ơn bạn rất nhiều!

Trả lời

67

Từ tài liệu Class mô-đun Python:

Private biến dụ”mà không thể được truy cập từ bên trong ngoại trừ một đối tượng không tồn tại trong Python. Tuy nhiên, có một quy ước được theo sau bởi hầu hết mã Python: một tên được đặt trước bằng dấu gạch dưới (ví dụ _spam) sẽ được coi là một phần không công khai của API (cho dù đó là hàm, phương thức hoặc thành viên dữ liệu) . Nó phải được coi là một chi tiết thực hiện và có thể thay đổi mà không cần thông báo.

Vì có trường hợp sử dụng hợp lệ cho thành viên riêng tư (cụ thể là để tránh xung đột tên có tên được xác định bởi lớp con), có hỗ trợ giới hạn cho cơ chế như vậy, gọi là mangling tên. Bất kỳ số nhận dạng nào của biểu mẫu __spam (ít nhất hai dấu gạch dưới hàng đầu, tối đa một dấu gạch dưới sau) được thay thế bằng văn bản bằng _classname__spam, trong đó classname là tên lớp hiện tại với các dấu gạch dưới hàng đầu bị tước. Việc xén này được thực hiện mà không quan tâm đến vị trí cú pháp của mã định danh, miễn là nó xảy ra trong định nghĩa của một lớp.

+1

Cảm ơn bạn! Vì vậy, nói chung mọi người sẽ chỉ sử dụng dấu gạch dưới hàng đầu để phân biệt giữa các hàm "công khai" và "riêng tư" trong mô-đun? – Kaifei

+9

Chủ yếu là. Giống như tài liệu nói, đó là một quy ước, bạn vẫn có thể truy cập các chức năng như chúng được công khai, nhưng cách "đúng" để làm mọi thứ là giả vờ chúng không thực sự ở đó. –

+0

Quy ước này có áp dụng cho các chức năng không dựa trên lớp không? – radtek

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