from PySide2 import QtCore, QtGui
from random import randint


class TestObject(QtCore.QObject):
    numberChanged = QtCore.Signal(int)

    def __init__(self, newNumber=0):
        QtCore.QObject.__init__(self)
        self.__number = newNumber

    @QtCore.Property(int, notify=numberChanged)
    def number(self):
        return self.GetNumber()

    @number.setter
    def setNumber(self, newNumber):
        self.__number = newNumber
        self.numberChanged.emit(self.__number)

    def GetNumber(self):
        return self.__number


def RandomNumber():
    return randint(0,1000000000)


def Timer(obj):
    obj.setNumber(RandomNumber())

    temp0 = obj.number              # This leaks (~1MB/cpusec)
    print(temp0)
    #temp1 = getattr(obj,'number')  # This leaks (~1MB/cpusec)
    #temp2 = obj.GetNumber()        # This does not leak
    #temp3 = RandomNumber()         # This does not leak


if __name__ == '__main__':
    app = QtGui.QGuiApplication([])
    print(QtCore.qVersion())

    obj = TestObject()

    exit_timer = QtCore.QTimer()
    exit_timer.timeout.connect(app.quit)
    exit_timer.start(2000)

    timer = QtCore.QTimer()
    timer.start(10)
    timer.timeout.connect(lambda: Timer(obj))
    app.exec_()

