File: LP6E/Chapter39/_QuizAnswers/Question2/access_test.py
"""
Test code: separate file to allow decorator reuse.
"""
import sys
from access import Private, Public
print('---------------------------------------------------------')
# Test 1: names are public if not private
@Private('age') # Person = Private('age')(Person)
class Person: # Person = onInstance with state
def __init__(self, name, age):
self.name = name
self.age = age # Inside accesses run normally
def __add__(self, N):
self.age += N # Built-ins caught by mix-in
def __str__(self):
return f'{self.name}: {self.age}'
X = Person('Bob', 40)
print(X.name) # Outside accesses validated
X.name = 'Sue'
print(X.name)
X + 10
print(X)
try: t = X.age # FAILS unless "python -O"
except: print(sys.exc_info()[1])
try: X.age = 999 # ditto
except: print(sys.exc_info()[1])
print('---------------------------------------------------------')
# Test 2: names are private if not public
# Operators must be non-Private or Public in BuiltinsMixin used
@Public('name', '__add__', '__str__', '__coerce__')
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __add__(self, N):
self.age += N # Built-ins caught by mix-in
def __str__(self):
return f'{self.name}: {self.age}'
X = Person('bob', 40) # X is an onInstance
print(X.name) # onInstance embeds Person
X.name = 'sue'
print(X.name)
X + 10
print(X)
try: t = X.age # FAILS unless "python -O"
except: print(sys.exc_info()[1])
try: X.age = 999 # ditto
except: print(sys.exc_info()[1])