Tôi có phương thức riêng def __pickSide(self):
trong lớp cha mà tôi muốn ghi đè trong lớp con. Tuy nhiên, lớp trẻ vẫn gọi là số def __pickSide(self):
được kế thừa. Làm thế nào tôi có thể ghi đè lên chức năng? Tên hàm của lớp con giống hệt tên hàm của cha mẹ.Làm cách nào để ghi đè các hàm của lớp cha trong python?
Trả lời
Hãy nhìn vào ví dụ đơn giản nhất:
from dis import dis
class A(object):
def __pick(self):
print "1"
def doitinA(self):
self.__pick()
class B(A):
def __pick(self):
print "2"
def doitinB(self):
self.__pick()
b = B()
b.doitinA() # prints 1
b.doitinB() # prints 2
dis(A.doitinA)
print
dis(B.doitinB)
Các tháo được như sau:
8 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_A__pick)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
15 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_B__pick)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
Như bạn thấy, Python mangles tên hàm mà bắt đầu bằng hai dấu gạch dưới (và truy cập đến như vậy tên !!) với tên bao gồm tên lớp - trong trường hợp này là _A__pick
và _B__pick
). Điều đó có nghĩa là lớp trong đó một hàm được xác định xác định phương thức nào của phương thức __pick
được gọi.
Giải pháp đơn giản, tránh các phương pháp giả riêng tư bằng cách xóa dấu gạch dưới kép. Ví dụ: sử dụng _pick
thay vì __pick
.
Sự cố bạn thấy là dấu gạch dưới kép mangle tên hàm ngay cả trong cuộc gọi. Điều này ngăn cản tính đa hình hoạt động bình thường vì tên nó bị xáo trộn dựa trên tên của lớp mà phương thức được định nghĩa và không phải là tên của lớp của đối tượng đang được tham chiếu. Thay thế dấu gạch dưới kép bằng cái gì đó khác sẽ giải quyết vấn đề này.
sử dụng tên của phương pháp để làm cho việc truy cập trang này trở nên phức tạp hơn khi bạn cần. Tôi khuyên bạn không bao giờ sử dụng chúng, điều này làm cho những thứ như thử nghiệm diễn ra suôn sẻ hơn.
Không có riêng tư trong Python, và nếu có, nó sẽ ngăn bạn làm điều này bằng cách nào đó. (Đây là điểm thứ tư trong các ngôn ngữ mà có nó.)
Các quy ước chung để chỉ ra rằng một thuộc tính không phải là một phần của giao diện công cộng của một lớp nó sử dụng một hàng đầu đơn nhấn, như
_foo
. Điều này là đủ để làm cho mã của bạn rõ ràng tách chi tiết nội bộ khỏi API công khai của bạn.
- 1. Cách ghi đè trường trong lớp cha
- 2. Làm cách nào để truy cập các thuộc tính lớp của lớp cha trong Python?
- 3. C#: ghi đè thuộc tính của lớp cha
- 4. Làm thế nào để ngăn chặn một hàm bị ghi đè trong python
- 5. Trong Gobject, cách ghi đè lên phương thức của lớp cha thuộc về một giao diện?
- 6. Làm cách nào để ghi đè quyền truy cập thuộc tính lớp trong python?
- 7. Làm cách nào để ghi đè ngắt bàn phím? (Python)
- 8. Ruby: Gọi phương thức ghi đè của lớp cha, trong lớp con
- 9. Làm thế nào tôi có thể ghi đè lên một hàm lớp cha với con trong Perl?
- 10. Làm cách nào để ghi đè nhập bằng Python?
- 11. python: ghi đè lớp "là" hành vi
- 12. Thừa kế và ghi đè các hàm của chuỗi std ::?
- 13. Làm thế nào để ghi đè lên các chức năng từ lớp String trong C#
- 14. Ghi đè hàm dựng mặc định của một phần lớp với một lớp khác
- 15. Cách dễ dàng ghi đè các phương thức mặc định trong các lớp Python tùy chỉnh?
- 16. Làm thế nào để ghi đè lên hàm trait và gọi nó từ hàm bị ghi đè?
- 17. Bạn làm cách nào để ghi lại các hàm và lớp PHP của mình?
- 18. Làm cách nào để ghi đè xóa trong C++?
- 19. Làm cách nào để ghi lại các hàm được ghi đè/triển khai mà không có Doxygens @copydoc?
- 20. Chuỗi ghi đè Python __hash__
- 21. Gọi hàm bị ghi đè từ một lớp cơ sở?
- 22. Python: ghi đè phép nhân
- 23. Làm cách nào để ghi đè RequestValidation trong ASP.NET WebAPI
- 24. Ghi đè an toàn các hàm ảo C++
- 25. Làm cách nào để ghi đè phương thức __call__ của đối tượng phương thức bằng Python?
- 26. Không sử dụng lớp học làm lớp cha trong Python
- 27. Ghi đè các thuộc tính
- 28. Ghi đè các trường hoặc thuộc tính trong lớp con
- 29. Làm cách nào để ghi lại các thuộc tính lớp trong Python?
- 30. Làm cách nào để ghi đè lên một hàm trong một tệp javascript khác?
Vui lòng không sử dụng tất cả các '__' đó. Họ đang bối rối. Thực sự không có "riêng tư" trong Python. Họ làm cho những điều đơn giản trông khó hiểu. Vui lòng cập nhật câu hỏi của bạn bằng ví dụ nhỏ nhất về mã hiển thị sự cố của bạn. –
Đó là mã tôi đang gặp rắc rối với ... bạn muốn gì hơn? Tôi biết rằng các hàm và biến "riêng tư" vẫn có thể được truy cập bằng Python, nhưng sẽ không sử dụng tất cả các hàm công cộng làm cho mọi thứ trở nên khó hiểu hơn khi sử dụng lớp? – wrongusername
"Đó là mã"? Mã gì? Bạn có thể cập nhật câu hỏi để thực sự cung cấp mẫu mã thực tế thực sự không hoạt động không? Rất khó đoán mã của bạn trông như thế nào. Thật dễ dàng để giả định mọi thứ; thật dễ dàng để giả định sai. "Nhiều hơn những gì bạn muốn?" Mã. Để xem xét và xem những gì bạn đang thực sự sai lầm, không phải những gì sai lầm tôi giả sử bạn đang thực hiện. –