2010-03-11 35 views
24

Có cách nào để làm cho một hàm lớp không thể bỏ qua? một cái gì đó giống như từ khóa final của java. tức là, mọi lớp ghi đè không thể ghi đè phương thức đó.Làm thế nào để ngăn chặn một hàm bị ghi đè trong python

+3

Bạn thậm chí không có các phương thức * riêng tư trong Python, các thành viên '__xxx' chỉ bị che khuất. Tôi thực sự ngạc nhiên, nếu có bất cứ thứ gì giống như một từ khóa 'final'. – Boldewyn

+0

Tại sao? Trường hợp sử dụng để ngăn chặn điều này là gì? Mọi người có thể đọc nguồn của bạn và viết lại hàm. Bạn đang cố làm gì vậy? –

+0

Tôi không biết tại sao tất cả các bạn cho rằng tôi muốn nó để ngăn chặn ai đó khác từ ghi đè nó - Tôi muốn ngăn chặn bản thân mình vô tình ghi đè nó trong tương lai. Giả sử tôi có một cây thừa kế tương đối sâu và một trong các lớp "sâu hơn" sẽ vô tình xác định lại func (quên nó ngay cả khi tồn tại) – olamundo

Trả lời

31

Vấn đề là bạn đang cố gắng viết bằng Python sử dụng triết lý Java. Một số thứ mang theo, nhưng không phải tất cả. Trong Python bạn có thể làm như sau và nó là hoàn toàn tốt đẹp, nhưng hoàn toàn đi ngược lại cách Java nghĩ về các đối tượng.

class Thing(object): 
    x = 1 
something = Thing() 
something.y = something.x 

Nếu bạn thực sự muốn, bạn có thể thử code posted here. Nhưng như bạn có thể thấy có rất nhiều mã ở đó để có được nó để làm những gì bạn muốn. Cũng cần lưu ý rằng ngay cả người đăng mã nói rằng nó có thể được thông qua bằng cách sử dụng __dict__ hoặc object.__setattr__.

+4

-1 Mã như vậy xứng đáng được giải thưởng Maginot Memorial For Futile Defense Mechanisms. –

+17

Tại sao -1? Tôi không viết mã mà tôi liên kết và tôi không khuyến khích sử dụng nó. Tôi tìm thấy nó với một tìm kiếm google và nghĩ rằng nó đã giúp chứng minh quan điểm của tôi rằng cố gắng để thực thi cuối cùng không phải là một ý tưởng tốt trong python. – unholysampler

+1

Để thậm chí liên kết với nó. –

70

Bạn có thể đặt một bình luận trong đó để tác động của:

# We'll fire you if you override this method. 

Thật ngạc nhiên như thế nào các giải pháp công nghệ thấp như công việc này trong thực tế.

+2

+1 Và nếu điều này được phát hiện từ báo cáo lỗi người dùng, chúng tôi sẽ kích hoạt những người không kiểm tra ứng dụng đúng cách. –

+4

Đây phải là một phần của chuỗi tài liệu (ví dụ: thông số API) thay vì nhận xét – vog

0

Có, đừng làm vậy.

Tôi nên thêm điều này sau khi bỏ phiếu xuống. Cơ chế bảo vệ như vậy được một số người nhìn thấy chống lại các đặc tính của Python, rằng "tất cả chúng ta đều là người lớn đồng ý ở đây". Bạn muốn bảo vệ những chức năng này từ đâu? Và nếu một bình luận sẽ không đủ tại sao cái gì đó 'mạnh hơn'?

Tôi sẽ ghi lại mong đợi của bạn và mong đợi các lập trình viên khác hành động có trách nhiệm.

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