Object orientism is just encapsulation. It’s the only thing that is required. You can have objects without inheritance and virtual dispatch.
class EncapsulatedCounter:
def __init__(self, initial_value):
_count = initial_value
def increment():
nonlocal _count
_count += 1
return _count
self.increment = increment
counter = EncapsulatedCounter(100)
new_value = counter.increment()
print(f"New value is: {new_value}") def make_counter(start=0):
count = start
def incr():
nonlocal count
count += 1
return count
return incr
Example: >>> c = make_counter()
>>> c()
1
>>> c()
2
But it hides nothing: >>> c.__closure__[0].cell_contents
2
>>> c.__closure__[0].cell_contents = -1
>>> c()
0
"private" in Python is cultural, not enforced. (you can access `self.__private` from outside too if you want).