Обязательное условие: Объектно-ориентированное программирование на 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>