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

出力:

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

"Loaded" は 1 回だけ出力されます (予想どおり、クラス変数です) が、シグナルの 2 つのインスタンスが作成されるのはなぜですか (クラス変数でもある場合)。

4

1 に答える 1

3

クラスインスタンスを作成するときではなく、クラススコープが実行されるときに出力されます。このコードは、「Test」のインスタンスを作成したことがない場合でも、「Loaded」を出力します。

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)
于 2011-09-28T01:13:36.847 に答える