Object Oriented Programming in Python | Set 2 (Data Hiding and Object Printing) (original) (raw)

Last Updated : 07 Jun, 2022

Prerequisite: Object-Oriented Programming in Python | Set 1 (Class, Object and Members)

Data hiding

In Python, we use double underscore (Or __) before the attributes name and those attributes will not be directly visible outside.

Python

class MyClass:

`` __hiddenVariable = 0

`` def add( self , increment):

`` self .__hiddenVariable + = increment

`` print ( self .__hiddenVariable)

myObject = MyClass()

myObject.add( 2 )

myObject.add( 5 )

print (myObject.__hiddenVariable)

Output :

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

In the above program, we tried to access a hidden variable outside the class using an object and it threw an exception.
We can access the value of a hidden attribute by a tricky syntax:

Python

class MyClass:

`` __hiddenVariable = 10

myObject = MyClass()

print (myObject._MyClass__hiddenVariable)

Output :

10

Private methods are accessible outside their class, just not easily accessible. Nothing in Python is truly private; internally, the names of private methods and attributes are mangled and unmangled on the fly to make them seem inaccessible by their given names [See this for source ].

Printing Objects

Printing objects give us information about objects we are working with. In C++, we can do this by adding a friend ostream& operator << (ostream&, const Foobar&) method for the class. In Java, we use toString() method.
In python, this can be achieved by using __repr__ or __str__ methods.

Python

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)

t = Test( 1234 , 5678 )

print (t)

print ([t])

Output :

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

Important Points about Printing:

Python

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)

t = Test( 1234 , 5678 )

print (t)

Output :

Test a:1234 b:5678

Python

class Test:

`` def __init__( self , a, b):

`` self .a = a

`` self .b = b

t = Test( 1234 , 5678 )

print (t)

Output :

<__main__.Test instance at 0x7fa079da6710>