Skip to content

Instantly share code, notes, and snippets.

@sloanlance
Created July 19, 2018 17:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sloanlance/c65ae4f4197f773e57ce13c1f9b64fd1 to your computer and use it in GitHub Desktop.
Save sloanlance/c65ae4f4197f773e57ce13c1f9b64fd1 to your computer and use it in GitHub Desktop.
Python: Class member access enforcement (not encapsulation)
# From Stack Overflow question:
# https://stackoverflow.com/questions/26216563/how-to-do-encapsulation-in-python
#
# Python has simple encapsulation, but it doesn't strictly enforce access to
# protected or private class members. This is one person's attempt to
# address that in a (misleadingly named) class.
#
# Could this be done with introspection rather than using on `self.privates` and
# `self.protected`? Follow the common Python style of naming variables `__a` and `_b`.
# Then the methods would check whether the names begin with `__` or `_` to allow or
# deny access.
import sys
class EncapsulationClass(object):
def __init__(self):
self.privates = ["__dict__", "privates", "protected", "a"]
self.protected = ["b"]
print self.privates
self.a = 1
self.b = 2
self.c = 3
pass
def __getattribute__(self, name):
if sys._getframe(1).f_code.co_argcount == 0:
if name in self.privates:
raise Exception("Access to private attribute \"%s\" is not allowed" % name)
else:
return object.__getattribute__(self, name)
else:
return object.__getattribute__(self, name)
def __setattr__(self, name, value):
if sys._getframe(1).f_code.co_argcount == 0:
if name in self.privates:
raise Exception("Setting private attribute \"%s\" is not allowed" % name)
elif name in self.protected:
raise Exception("Setting protected attribute \"%s\" is not allowed" % name)
else:
return object.__setattr__(self, name, value)
else:
return object.__setattr__(self, name, value)
example = EncapsulationClass()
example.a = 10 # Exception: Setting private attribute "a" is not allowed
example.b = 10 # Exception: Setting protected attribute "b" is not allowed
example.c = 10 # example.c == 10
example.__dict__["privates"] # Exception: Setting protected attribute "b" is not allowed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment