You are currently viewing Объектно-ориентированное программирование на Python | Набор 2 (Скрытие данных и печать объектов)

Объектно-ориентированное программирование на Python | Набор 2 (Скрытие данных и печать объектов)

Обязательное условие: Объектно-ориентированное программирование на Python | Набор 1 (Класс, объект и члены)

Сокрытие данных

В Python мы используем двойное подчеркивание (или __) перед именем атрибутов, и эти атрибуты не будут непосредственно видны снаружи.

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)

Выход :

2
7
Traceback (most recent call last):
 File "filename.py", line 13, in 
 print (myObject.__hiddenVariable)
AttributeError: MyClass instance has 
no attribute '__hiddenVariable' 

В приведенной выше программе мы попытались получить доступ к скрытой переменной вне класса, используя объект, и это вызвало исключение.
Мы можем получить доступ к значению скрытого атрибута с помощью сложного синтаксиса:

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

Выход:

10

Частные методы доступны за пределами их класса, просто их нелегко получить. Ничто в Python не является по-настоящему личным; внутренне, имена частных методов и атрибутов искажаются и распутываются на лету, чтобы они казались недоступными по их именам.

 Объекты Печати 

Объекты печати предоставляют нам информацию об объектах, с которыми мы работаем. В C++ мы можем сделать это, добавив друга ostream& оператор < В Java мы используем метод toString ().
В python это может быть достигнуто с помощью методов __repr__ или __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__()

Выход:

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

Важные моменты, касающиеся печати: 

  • Если метод __str__ не определен, print t (или print str(t)) использует __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
  • Если метод __repr__ не определен, то используется значение по умолчанию.
class Test:
	def __init__(self, a, b):
		self.a = a
		self.b = b

# Driver Code	
t = Test(1234, 5678)
print(t)

Выход:

<__main__.Test instance at 0x7fa079da6710>