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

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.

filter_none

edit
close

play_arrow

link
brightness_4
code

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)

chevron_right


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 hidden variable outside the class using object and it threw an exception.



We can access the value of hidden attribute by a tricky syntax:

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


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 gives 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.
filter_none

edit
close

play_arrow

link
brightness_4
code

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__()

chevron_right


Output :

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

Important Points about Printing:

  • If no __str__ method is defined, print t (or print str(t)) uses __repr__.
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    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) 

    chevron_right

    
    

    Output :

    Test a:1234 b:5678
  • If no __repr__ method is defined then the default is used.

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    class Test:
        def __init__(self, a, b):
            self.a = a
            self.b = b
      
    # Driver Code        
    t = Test(1234, 5678)
    print(t) 

    chevron_right

    
    

    Output :

    <__main__.Test instance at 0x7fa079da6710>

This article is contributed by Shwetanshu Rohatgi. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up


Article Tags :

5


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.