Python cung cấp cho chúng ta khả năng tạo các phương thức và biến 'riêng tư' trong một lớp bằng cách thêm hai dấu gạch dưới vào tên, như thế này : __myPrivateMethod()
. Làm thế nào, sau đó, người ta có thể giải thích điều này
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Thỏa thuận là gì?!
Tôi sẽ giải thích điều này một chút cho những người không hiểu điều đó.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Những gì tôi đã làm là tạo ra một lớp với một phương thức công khai và một phương thức riêng tư và khởi tạo nó.
Tiếp theo, tôi gọi phương thức công khai của nó.
>>> obj.myPublicMethod()
public method
Tiếp theo, tôi thử và gọi phương thức riêng tư của nó.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Mọi thứ có vẻ tốt ở đây; chúng tôi không thể gọi nó. Trên thực tế, đó là 'riêng tư'. Chà, thực ra thì không. Chạy dir () trên đối tượng cho thấy một phương thức ma thuật mới mà python tạo ra một cách kỳ diệu cho tất cả các phương thức 'riêng tư' của bạn.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Tên của phương thức mới này luôn là một dấu gạch dưới, theo sau là tên lớp, theo sau là tên phương thức.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Quá nhiều cho việc đóng gói, nhỉ?
Trong mọi trường hợp, tôi luôn nghe thấy Python không hỗ trợ đóng gói, vậy tại sao lại thử? Đưa cái gì?