Restrict an attribute access#

Question#

Restrict the access to an attribute in a class.

Solution#

class RestrictingWrapper(object):
    def __init__(self, obj, to_block):
        self._obj = obj
        self._to_block = to_block

    def __getattr__(self, name):
        if name in self._to_block:
            raise AttributeError(name)
        return getattr(self._obj, name)

class Foo(object):
    def __init__(self, x, y, z):
        self.x, self.y, self.z = x, y, z

f1 = Foo(1, 2, 3)
print(f1.x, f1.y, f1.z)

f2 = RestrictingWrapper(f1, "z")
print(f2.x, f2.y)
print(f2.z)

Explanation#