Created
July 19, 2018 17:33
-
-
Save sloanlance/c65ae4f4197f773e57ce13c1f9b64fd1 to your computer and use it in GitHub Desktop.
Python: Class member access enforcement (not encapsulation)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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