2009-07-21 33 views
10

Python cung cấp private name mangling cho các phương thức và thuộc tính của lớp học.Lợi ích của việc mang tên riêng trong Python là gì?

Có bất kỳ trường hợp cụ thể nào mà tính năng này được yêu cầu hay chỉ là việc chuyển đổi từ Java và C++?

Vui lòng mô tả trường hợp sử dụng khi sử dụng tên xâu Python, nếu có?

Ngoài ra, tôi không quan tâm đến trường hợp tác giả chỉ đang cố ngăn chặn truy cập thuộc tính bên ngoài tình cờ. Tôi tin rằng trường hợp sử dụng này không phù hợp với mô hình lập trình Python.

Trả lời

0

Tên mangling ở đó để ngăn truy cập thuộc tính bên ngoài tình cờ. Chủ yếu là, nó có để đảm bảo rằng không có xung đột tên.

+0

tôi đã đề cập trong câu hỏi ban đầu. Bạn có nói rằng bạn không đồng ý? – cmcginty

+0

Tôi đang nói đó là lý do. Vì vậy, bạn không vô tình có tên xung đột khi bạn phân lớp. –

23

Đó là một phần để ngăn tình cờ truy cập nội bộ. Dưới đây là một ví dụ:

Trong code của bạn, đó là một thư viện:

class YourClass: 
    def __init__(self): 
     self.__thing = 1   # Your private member, not part of your API 

Trong mã của tôi, trong đó tôi đang kế thừa từ lớp thư viện của bạn:

class MyClass(YourClass): 
    def __init__(self): 
     # ... 
     self.__thing = "My thing" # My private member; the name is a coincidence 

Nếu không có tên mangling tin , việc tái sử dụng ngẫu nhiên tên của bạn sẽ phá vỡ thư viện của bạn.

+0

IMO, YourClass phải xác định _thing, thay vì __thing. Điều này sẽ cho phép MyClass truy cập nó. Thứ hai, tôi thấy lợi ích của việc sử dụng '__thing' trong MyClass, nếu có lo ngại rằng việc triển khai YourClass sẽ thay đổi. Vấn đề duy nhất, là nếu ai đó muốn subclass MyClass, sau đó bạn đã làm cho nó khó khăn hơn cho họ để truy cập 'MyClass .__ điều'. Nó cảm thấy như bạn đang hy sinh tái sử dụng trong tương lai, để bảo vệ chống lại một vấn đề "tưởng tượng". Không? – cmcginty

+5

@Casey: Bạn nói đúng rằng có các biến thành viên mà bạn muốn hiển thị với các lớp con và những biến bạn đặt tên với một dấu gạch dưới đơn. Bạn sẽ làm cho chúng được 'bảo vệ' trong C++. Nhưng cũng có các thành viên mà bạn * không * muốn hiển thị cho các lớp con, vì chúng là một phần của việc triển khai riêng tư lớp của bạn (và như bạn nói, chúng có thể thay đổi việc thực hiện). Đó là những tên mangling là cho. Đây không phải là một vấn đề tưởng tượng; Tôi đã thực sự làm chính xác những gì tôi đang nói, với một thư viện sử dụng một dấu gạch dưới đơn chứ không phải là một đôi cho một thành viên tư nhân. – RichieHindle

+0

@RichieHindle: Chính xác. Ngoại trừ việc đây là quyền truy cập EXTERNAL. ;) Phân lớp được xem là bên ngoài ở đây. –

16

Từ PEP 8:

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 chúng với dấu gạch hàng đầu đôi và không có dấu gạch dưới. Điều này gọi thuật toán mangling tên của Python, trong đó tên của lớp được mang vào tên thuộc tính. Điều này giúp tránh va chạm tên thuộc tính nên các lớp con vô tình chứa các thuộc tính có cùng tên.

(Nhấn mạnh thêm)

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