OOP Python – Data hiding và Object Printing

22/02/2023 - lượt xem
Chia sẻ
 
Rate this post

Trong bài viết trước chúng ta đã tìm hiểu về khái niệm cơ bản OOP trong Python. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu thêm về khả năng truy cập và in đối tượng trong Python

Data hiding – Khả năng truy cập dữ liệu

Trong các ngôn ngữ lập trình khác như C# hay Java chúng ta có các cấp độ như private, protected, public. Thì đối với Python cũng chúng ta cũng có cơ chế truy cập tương tự

Trong Python, chúng ta sử dụng 2 dấu gạch dưới (__) trước mỗi tên thuộc tính. Điều này chỉ định rằng, thuộc tính không thể truy cập trực tiếp từ bên ngoài.

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ả nhận được 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 ví dụ trên, chúng ta quyết định truy cập vào 1 biến (thuộc tính) dạng hidden từ bên ngoài class và nhận được lỗi thông báo.

Tuy nhiên, chúng ta có thể sử dụng thủ thuật để truy cập giá trị này

# 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)

Các phương thức dạng private có thể truy cập từ bên ngoài class, mặc dù rằng không dễ để làm điều này.

Chú ý rằng, không một thứ gì trong Python thực sự là private cả.

Printing Objects – In thuộc tính

Việc in ra các đối tượng đưa cho chúng ta thông tin về các đối tượng đang làm việc cùng. Trong Java chúng ta có thể sử dụng hàm toString().

Trong Python, điều này thực hiện thông qua hàm __repr__ hoặc __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ả

From str method of Test: a is 1234,b is 5678
[Test a:1234 b:5678]

Một số điểm cần lưu ý

Nếu không có hàm __str__ nào được định nghĩa thì khi chạy lệnh print t( hoặc printstr(t)), python sẽ gọi hàm __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)
Test a:1234 b:5678

Nếu không có hàm __repr__ nào được định nghĩa hàm mặc định sẽ được 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ả

<__main__.Test instance at 0x7fa079da6710>

Tổng kết

Với việc hiểu biết hơn về quyền truy cập thuộc tính cũng như in ra đối tượng trong Python. CodeTuTam hi vọng rằng điều này sẽ hỗ trợ bạn trong quá trình học, debug và làm việc cùng với Python.

 

 

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Odoo

    Xem thêm