class A(object):
def __get(self):
pass
def _m(self):
return self.__get()
class B(A):
def _m(self):
return str(self.__get())
print(A()._m())
print(B()._m())
Tại sao print(A()._m())
in None
, nhưng print(B()._m())
tăng AttributeError: 'B' object has no attribute '_B__get'
?đúp nhấn trong python
Tôi nghĩ rằng dấu gạch dưới kép ngăn chặn phương pháp ghi đè.
CẬP NHẬT
Bạn viết rằng __get
là tư nhân.
Sau đó, tại sao công việc sau đây?
class A(object):
def __get(self):
pass
def _m(self):
return self.__get()
class B(A):
pass
print(A()._m())
print(B()._m())
Tại sao mã này không làm tăng AttributeError
và in None
hai lần?
[Tên mangling] (https://docs.python.org/3/tutorial/classes.html#private-variables). Gọi 'self .__ get()' trong 'B' thực sự gọi' self._B__get() ', không tồn tại. Trừ khi bạn muốn hành vi này, không sử dụng dấu gạch dưới kép hàng đầu. – kindall
Khám phá [ý nghĩa của dấu gạch dưới đơn và dấu gạch đôi là gì trước tên đối tượng] (https://stackoverflow.com/questions/1301346/what-is-the-meaning-of-a-single-and-a -double-underscore-before-an-object-name? rq = 1) và một số câu hỏi được liên kết vì có một số giải thích chi tiết. – JGreenwell
Cập nhật của bạn: Bởi vì bạn đang gọi __get từ một phương thức được định nghĩa trong lớp A. Điều đó hoàn toàn hợp pháp trong bất kỳ ngôn ngữ nào hỗ trợ khái niệm riêng tư - thực tế đó là trường hợp sử dụng phổ biến nhất của các phương thức riêng tư. –