2011-09-28 64 views
1
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 

輸出:(如預期,它是一類變量)PySide信號「複製」的行爲

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

「加載」僅印刷一次,但爲什麼要創建的信號的2個實例(如果它也是一個類變量)?

+0

不是問題的學術?它的工作原理非常重要:所有實例都可以發出信號,所有用戶(連接到信號的所有實例)都可以獲得信號。我同意這很有趣。但它不是一個缺陷,或限制大多數程序。 – bootchk

回答

3

當您創建類實例時,它不會被打印,而是在執行類作用域時被打印。此代碼將打印「加載」,即使我從未做過「測試」的實例。

class Test: 
    print "Loaded" 

如果你想上課的時候被初始化爲運行代碼,看看__init__()。此代碼將在實例製作時打印出「已加載」,而不是定義類本身。

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

QT的QObject元類似乎在重寫類屬性以防止在初始化類的新實例時出現重複信號。也許你可以指定這樣的屬性:

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) 
+0

是的,我明白這一點,但爲什麼會創建2個信號實例?我會編輯我的問題以使其更清楚。 –

+0

'QObject'是一個元類。我最好的猜測是它正在改變班級屬性。如果你不從'QObject'繼承,結果是不同的,對嗎? – lunixbochs

+0

如果我將'QObject'改爲'object',信號將不起作用,但變量指向相同的內存位置。所以這可能是對的。你認爲這種變化的可能性(在未來的Qt版本中)如何? –