class Privacy:
    def __setattr__(self, attr, value):             # Dla self.attrname = value
        if attr in self.privates:
            raise NameError(f'{attr!r} for {self}') 
        else:
            self.__dict__[attr] = value             # Klucz słownika zapobiegający zapętleniu
class Test1(Privacy):
    privates = ['age']

class Test2(Privacy):
    privates = ['name', 'pay']
    def __init__(self):
        self.__dict__['name'] = 'Tomasz'               # Lepsze rozwiązanie znajdziesz w rozdziale 39!

if __name__ == '__main__':
    x = Test1()
    x.name = 'Anna'     # Działa
    print(x.name)
   #x.age = 40          # Nie działa

    y = Test2()
    y.age = 30          # Działa
    print(y.age)
   #y.name = 'Robert'   # Nie działa

