Aamir Adnan Aamir Adnan - 17 days ago 8
Python Question

Data Hiding in Python Class

I know that the attributes of class which are declared by double underscore

__
prefix may or may not visible outside the class definition. As we can still access those attributes by
object._className__attrName
.

class A:
def __init__(self):
self.a = 1
self.b = 2
----
----
self.z = 26
self.catch = 100


Now to protect all attributes except the attribute
catch
, I have to declare them with double underscore which is quite messy. Is there a way I can say in my class definition that only
self.catch
can be accessed outside the class?

Apologies if this is answered somewhere else or discussed earlier.

Answer

Yes, it is possible to hide private data in a closure -- at least, if there is a way to access private from outside make_A, I haven't found it:

def make_A():
    private = {
        'a' : 1,
        'b' : 2,
        'z' : 26,
        }
    class A:
        def __init__(self):
            self.catch = 100
            private['a'] = 2    # you can modify the private data
        def foo(self):
            print(private['a']) # you can access the private data 
    return A

A = make_A()

a=A()

a.foo()
# 2

Notice that private is not in dir(a)

print('private' in dir(a))
# False

Although this is possible, I do not think this is recommendable way to program in Python.


Above, private is shared by all instances of A. To use private data on a per-instance basis, add self to the dict key:

def make_A():
    private = {}
    class A:
        def __init__(self):
            self.catch = 100
            private[self,'a'] = 1    # you can modify the private data
            private[self,'b'] = 2    
            private[self,'z'] = 26    
        def foo(self):
            print(private[self,'a']) # you can access the private data 
    return A