import uuid
import weakref

class HideStorageMeta(type):
    def __dir__(cls):
        return [item for item in super().__dir__() if item != '_storage']

class RiddleData:
    def __init__(self, poly):
        self.poly = poly
        self.calls = 0

class Riddle(metaclass=HideStorageMeta):
    _storage = {}
    
    def __init__(self, p):
        self.__id = uuid.uuid4()
        Riddle._storage[self.__id] = RiddleData(p)
        self.__finalizer = weakref.finalize(self, self._cleanup, self.__id)

    def _cleanup(self, id):
        if id in Riddle._storage:
            del Riddle._storage[id]

    def __call__(self, x):
        if self.__id not in Riddle._storage:
            raise KeyError(f"Instance with ID {self.__id} not found in storage.")
        
        data = Riddle._storage[self.__id]
        if data.calls < 2:
            data.calls += 1
            return sum(data.poly[i] * x**i for i in range(len(data.poly)))
        else:
            raise Exception("Too many calls")

    def __dir__(self):
        return [item for item in super().__dir__() if item != '_storage']

# Test the class
poly = [7, 3, 4, 5, 0, 8, 3, 1]
r = Riddle(poly)


# This will not give any useful information because _storage is hidden
print(vars(r))

# _storage should not be visible in dir output
print(dir(r))



def find(ev):  
    b = ev(1) + 1
    e = ev(b)
    ans = []
    while e > 0:
        q, r = divmod(e, b)
        ans.append(r)
        e = q
    return ans    

ans = find(r)
print(ans)

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: