Почему PySide неявно создает члены объекта из членов класса для сигналов?
НаСтраница сигналов и слотов PySide в нем говорится: «Сигналы - это объекты времени выполнения, принадлежащие экземплярам, а не атрибуты класса». Очевидно, конструктор QObject просматривает атрибуты класса для сигналов и копирует их в экземпляр объекта. Это подтверждается моей тестовой программой.
из PySide импортировать QtCore
class Klass(QtCore.QObject):
lst = []
sig = QtCore.Signal(str)
def main():
obj1 = Klass()
obj2 = Klass()
print "id: obj1.lst = {}, obj1.sig = {}".format(id(obj1.lst), id(obj1.sig))
print "id: obj2.lst = {}, obj2.sig = {}".format(id(obj2.lst), id(obj2.sig))
print "id: klass.lst = {}, klass.sig = {}".format(id(Klass.lst), id(Klass.sig))
if __name__ == '__main__':
main()
В моем выводе вы можете видеть, что теперь есть три объекта сигнала, тогда как идентификатор lst-member одинаков как для объектов, так и для класса.
id: obj1.lst = 4317739344, obj1.sig = 4297560376
id: obj2.lst = 4317739344, obj2.sig = 4297560400
id: klass.lst = 4317739344, klass.sig = 4317851072
Неявное создание атрибутов объекта является просто запутанным и, следовательно, плохим стилем (ИМХО). Может быть, у них есть веские причины для этого, но я их не вижу. Итак, мой вопрос: почему они выбрали это решение вместо того, чтобы просто создать сигнал как обычный атрибут в конструкторе?