This library provides access control mechanisms for Python classes, including Private, Protected, Internal, and Public variables and methods. Python does not enforce strict access modifiers like Java or C++, but this library uses descriptors and decorators to simulate them.
pip install PyAccessModifier or
pip install git+https://github.com/howShouldIChooseMyUsername/PyAccessModifier.git from PyAccessModifier import * # Recommended # or import PyAccessModifier- Purpose: Restrict access to the variable only within the defining class.
- Example:
@API class MyClass: @privateinit def init(self): self._privateValue = Private(40) obj = MyClass() print(obj.my_private) # PermissionError- Behavior:
- Reading or writing from outside the class raises
PermissionError. - Only instances of the defining class can access the value.
- Reading or writing from outside the class raises
- Purpose: Restrict access to the class-level variable only within the defining class.
- Example:
from PyAccessModifier import Private, public class MyClass: # Class-level private variable class_private = Private(42) @public def show_private(self): print("Internal access:", self.class_private) @public def change_private(self, value): self.class_private = value obj = MyClass() # Access via class methods (allowed) obj.show_private() # Internal access: 42 obj.change_private(99) obj.show_private() # Internal access: 99 # Direct external access (raises PermissionError) print(obj.class_private) # PermissionError obj.class_private = 123 # PermissionError- Behavior:
- Reading or writing from outside the class raises
PermissionError. - Accessing or modifying the variable inside the class methods works as expected.
- Reading or writing from outside the class raises
- Purpose: Allow access only from the defining class and its subclasses.
- Example:
class MyClass: my_protected = Protected(10) class Child(MyClass): def access_protected(self): print(self.my_protected)- Behavior:
- Reading or writing from unrelated classes raises
PermissionError. - Subclasses can access and modify the value.
- Reading or writing from unrelated classes raises
- Purpose: Restrict access to code within the same folder/module.
- Example:
class MyClass: my_internal = Internal(99)- Behavior:
- Access from files outside the same folder raises
PermissionError. - Useful for module-level encapsulation.
- Access from files outside the same folder raises
- Purpose: Standard public variable, no access restriction.
- Example:
class MyClass: my_public = Public(123)- Behavior:
- Can be accessed and modified freely from anywhere.
- Purpose: Restrict method access to the defining class only.
- Example:
class MyClass: @private def secret_method(self): print("Private Method")- Behavior:
- Calling from outside the class raises
PermissionError.
- Calling from outside the class raises
- Purpose: Allow method access from the defining class and subclasses.
- Example:
class MyClass: @protected def prot_method(self): print("Protected Method")- Behavior:
- Calling from unrelated classes raises
PermissionError.
- Calling from unrelated classes raises
- Purpose: Restrict method access to the same folder/module.
- Example:
class MyClass: @internal def internal_method(self): print("Internal Method")- Behavior:
- Calling from files in different folders raises
PermissionError.
- Calling from files in different folders raises
- Purpose: Standard public method, no restriction.
- Example:
class MyClass: @public def pub_method(self): print("Public Method")- Behavior:
- Can be called from anywhere.
- Purpose: Required when using
@privateinit; ensures instance-level private variables are properly initialized. - Example:
@AutoPrivateInit # or @API class MyClass: @privateinit def private_init(self): self._private_value = Private(10)- Behavior:
- Automatically runs all methods marked with
@privateinitafter init. - Can be called from anywhere, but the decorator itself must be applied to the class whenever
@privateinitis used.
- Automatically runs all methods marked with
- Purpose: Initialize private variables separately from
__init__(); runs automatically on instance creation. - Example:
@AutoPrivateInit class Myclass: privateVariable = Private(1) def __init__(self): Myclass.privateVariable = 2 # Error : will raise PermissionError if a subclass calls super().__init__() @privateinit def init(self): Myclass.privateVariable = 2 # Right usage self.privateVariable2 = Private(2)- Purpose: Restrict access to the defining class only; prevents subclass or external code from instantiating or accessing the class directly.
- Example:
@private class MyClass: @staticmethod def private_class(): print("private class")- Behavior:
- Calling from outside the class raises
PermissionError.
- Calling from outside the class raises
- Purpose: Allow access to the defining class and its subclasses; prevents external code from instantiating or accessing the class directly.
- Example:
@protected class MyClass: @staticmethod def protected_class(): print("protected class")- Behavior:
- Calling from unrelated classes raises
PermissionError.
- Calling from unrelated classes raises
- Purpose: Restrict access to the defining class within the same folder/module; prevents external code from instantiating or accessing the class from other folders/modules.
- Example:
@internal class MyClass: @staticmethod def internal_class(): print("internal class")- Behavior:
- Calling from files in different folders raises
PermissionError.
- Calling from files in different folders raises
- Purpose: Standard public class; allows unrestricted instantiation and access from any scope.
- Example:
@public class MyClass: @staticmethod def public_class(): print("public class")- Behavior:
- Can be called from anywhere.
class MyClass: my_private = Private(42) my_protected = Protected(10) my_internal = Internal(99) my_public = Public(123) @private def secret_method(self): print(self.my_private) @protected def prot_method(self): print(self.my_protected) @internal def internal_method(self): print(self.my_internal) @public def pub_method(self): print(self.my_public) class Child(MyClass): def access_protected(self): print(self.my_protected) self.prot_method() @private class PrivateClass : def __init__(self): print("This is a private class!") @internal class InternalClass : def __init__(self): print("This is a internal class!") @protected class ProtectedClass : def __init__(self): print("This is a protected class!") @public class PublicClass : def __init__(self): print("This is a public class!")Notes:
- Version 0.4.3
- Python does not natively support strict access control.
- This library leverages descriptors for variables and decorators for methods.
- Use with caution, as it relies on call stack inspection (
inspect) and may not cover all edge cases. - Any class, method, or variable not explicitly marked with an access modifier is considered public by default.
- Always place class-level access control decorators at the top, above other decorators.