PySide Signal "дублирует" поведение - PullRequest
       20

PySide Signal "дублирует" поведение

1 голос
/ 28 сентября 2011
from PySide.QtCore import *

class Eggs(QObject):
    evt_spam = Signal()
    print "Loaded"

a = Eggs()
b = Eggs()
print a.evt_spam
print b.evt_spam
print a.evt_spam is b.evt_spam

выводит:

Loaded
<PySide.QtCore.Signal object at 0xa2ff1a0>
<PySide.QtCore.Signal object at 0xa2ff1b0>
False

"Loaded" печатает только один раз (как и ожидалось; это переменная класса), но почему создаются 2 экземпляра сигнала (если это такжепеременная класса)?

1 Ответ

3 голосов
/ 28 сентября 2011

Он печатается не при создании экземпляра класса, а при выполнении области видимости класса.Этот код напечатает «Loaded», хотя я никогда не создавал экземпляр «Test».

class Test:
    print "Loaded"

Если вы хотите запустить код при инициализации класса, взгляните на __init__().Этот код будет печатать «Loaded» при создании экземпляра, а не при определении самого класса.

class Test:
    def __init__(self):
        print "Loaded"

Похоже, что метакласс QObject QT переписывает атрибуты класса для предотвращения дублирования сигналов при инициализации нового класса.экземпляр класса.Возможно, вы можете назначить атрибут следующим образом:

class Test(QObject):
    def __init__(self, signal):
        self.evt_spam = signal

sig = Signal()
a = Test(sig)
b = Test(sig)

Или это:

class Test(QObject):
    def signal(self, signal):
        self.evt_spam = evt_spam
        return self

evt_spam = Signal()
a = Test().signal(evt_spam)
b = Test().signal(evt_spam)
...