Chào mọi người,
Như tiêu đề thì mình muốn biết có tồn tại các mức truy cập cho class trong ngôn ngữ python.
Lấy ví dụ như ngôn ngữ Javacó các từ khóa để phần quyền truy cập như private, public, protected, …
Chào mọi người,
Như tiêu đề thì mình muốn biết có tồn tại các mức truy cập cho class trong ngôn ngữ python.
Lấy ví dụ như ngôn ngữ Javacó các từ khóa để phần quyền truy cập như private, public, protected, …
Theo mình biết là trong python không có private thật sự đâu bạn
Có cái idiom thế này:
We are all adults. Feel free to shoot yourself in the foot if you must. (hình như ông Guido nói thì phải
)
Hoặc là:
ok, kids, wait 'til you grow up to drink, smoke and access private variables
Bạn có thể dùng 2 dấu gạch dưới __
để dánh dấu nó là private, nhưng mà vẫn có cách để truy cập biến đó nếu bạn thích
Vậy thì theo bạn các đặc tính bao đống của hướng đối tượng python còn giữ không?
Mình cũng đã tìm hiểu và nhiều nguồn nói dùng __ để định nghĩa biến private
class Abc():
__abc = 1
obj = Abc()
obj.__abc = 2
print obj.__abc
Kết quả là biến __abc của class vẫn có thể truy cập và sửa đổi. Theo mình nghĩ __ chỉ là cách quy định (code style) những biến nào là biến private.
Cái dòng obj.__abc = 2
của bạn bản chất nó là tạo ra 1 biến obj.__abc chứ không phải là sử dụng __abc của object, proof: bạn thử bỏ dòng obj.__abc = 2
đi xem
Thực sự mình cũng đang băn khoăn cái kiểu tạo ra biến mới như này, cơ mà chưa search được
Còn nếu bạn muốn truy cập vào biến đó thì phải dùng obj._Abc__abc
Vậy nên là tính bao đóng thì mình nghĩ là còn (cho đến khi bạn muốn)
Thanks bạn, nhờ vậy mà mình thấy được kiểu khai báo biến mới này
Với cách truy cập này, mình vẫn có thể sửa, như vậy đâu còn gọi là bao đóng
Có lẽ vậy, thực tế là mình cũng không biết định nghĩa bao đóng nó như nào cơ mà cách truy cập này không được recommend, nên chả ai dùng cả, bạn gõ
obj.__dict__
thì chỉ thấy mấy biến “thông thường” chứ không thấy _Abc_abc__
với cả nếu dùng Pycharm hoặc ipython chẳng hạn, thì sẽ không có auto complete cho _Abc__abc
, và ide luôn có warning nên là không phải lo lắm.