Nội dung chính
1. Che giấu dữ liệu
Trong Python, chúng ta sử dụng hai dấu gạch dưới liên tiếp (tức là __) trước tên của các thuộc tính, và các thuộc tính đó sẽ không thể được nhìn thấy trực tiếp, khi ở bên ngoài lớp.
Dưới đây là một ví dụ về che giấu dữ liệu của lớp trong Python:
# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------
class MyClass:
# Hidden member of MyClass
__hiddenVariable = 0
# A member method that changes
# __hiddenVariable
def add(self, increment):
self.__hiddenVariable += increment
print (self.__hiddenVariable)
# Driver code
myObject = MyClass()
myObject.add(2)
myObject.add(5)
# This line causes error
print (myObject.__hiddenVariable)
Kết quả in ra là:
2
7
Traceback (most recent call last):
File "filename.py", line 13, in
print (myObject.__hiddenVariable)
AttributeError: MyClass instance has
no attribute '__hiddenVariable'
Trong đoạn chương trình trên, chúng ta đã cố truy cập tới biến được che giấu, từ bên ngoài lớp bằng cách sử dụng đối tượng myObject, và một ngoại lệ (exception) đã được ném ra.
Chúng ta có thể truy cập đến giá trị của thuộc tính được che giấu bằng một cú pháp mẹo sau:
Đoạn chương trình Python mô tả cách mà các thành viên được che giấu có thể được truy cập đến, từ bên ngoài lớp:
# A Python program to demonstrate that hidden
# members can be accessed outside a class
class MyClass:
# Hidden member of MyClass
__hiddenVariable = 10
# Driver code
myObject = MyClass()
print(myObject._MyClass__hiddenVariable)
Kết quả in ra là:
10
Các private methods – phương thức bí mật đều có thể được truy cập tới từ bên ngoài lớp mà chúng thuộc về, chỉ là việc truy cập này sẽ khó khăn hơn một chút. Trong Python thì không có cái gì thực sự là private; về bản chất, tên của các phương thức bí mật và thuộc tính bí mật sẽ được Python xử lý sao cho chúng trông như không thể được truy cập tới thông qua những cái tên đó.
2. In ra các đối tượng
Việc in ra các đối tượng cung cấp cho chúng ta các thông tin về những đối tượng mà mình đang phải làm việc cùng. Trong C++, chúng ta có thể thực hiện điều này bằng cách thêm một hàm bạn ostream& operator << (ostream&, const Foobar&) cho lớp. Trong Java, chúng ta sẽ sử dụng phương thức toString(). Trong Python, có thể đạt được điều này bằng cách sử dụng các phương thức __repr__or__str.
class Test:
def __init__(self, a, b):
self.a = a
self.b = b
def __repr__(self):
return "Test a:%s b:%s" % (self.a, self.b)
def __str__(self):
return "From str method of Test: a is %s," \
"b is %s" % (self.a, self.b)
# Driver Code
t = Test(1234, 5678)
print(t) # This calls __str__()
print([t]) # This calls __repr__()
Kết quả in ra là:
From str method of Test: a is 1234,b is 5678
[Test a:1234 b:5678]
Một số điểm quan trọng khi in ra đối tượng
– Nếu không có phương thức __str__ nào được định nghĩa, thì hàm print t (hoặc print str(t)) sẽ sử dụng __repr__
class Test:
def __init__(self, a, b):
self.a = a
self.b = b
def __repr__(self):
return "Test a:%s b:%s" % (self.a, self.b)
# Driver Code
t = Test(1234, 5678)
print(t)
Kết quả in ra là:
Test a:1234 b:5678
– Nếu không có phương thức __repr__ nào được định nghĩa, thì phương thức mặc định sẽ được sử dụng.
class Test:
def __init__(self, a, b):
self.a = a
self.b = b
# Driver Code
t = Test(1234, 5678)
print(t)
Kết quả in ra là:
<__main__.Test instance at 0x7fa079da6710>
Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
- Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
- Ebook về python tại đây.
- Các series tự học lập trình khác
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!