Проблема с попыткой использовать имя класса в его собственном разделе переменных класса

Я пишу приложение на Python и PyQt прямо сейчас, и у меня возникла небольшая проблема. Эта проблема не требует знания самого PyQt, только знания статических переменных в python. Я пытаюсь добавить некоторые сигналы в класс, который будет испускать экземпляр класса при срабатывании сигнала.

У меня есть что-то вроде этого:

class Foo(QObject):
    # ...
    # Signals
    updated = pyqtSignal(Foo)
    moved = pyqtSignal(Foo)
    # ...

Python дает мне ошибку:

NameError: name 'Foo' is not defined

IIRC, это как-то связано с тем, что класс Foo привязан к глобальным переменным. Я также не могу использовать здесь self. Будем признательны за любую помощь в решении этой проблемы.


person Benjamin    schedule 25.08.2014    source источник


Ответы (2)


Проблема в том, что оператор updated = pyqtSignal(Foo) оценивается во время создания Foo, поэтому Foo не существует, когда этот оператор оценивается. В общем случае вам придется переместить его за пределы класса. определение, хотя может быть некоторая магия pyqt (например, использование QObject вместо Foo, как описано в другом ответе):

class Foo(...):
   ...

Foo.updated = pyqtSignal(Foo)
person mgilson    schedule 25.08.2014
comment
Я думал об использовании QObject, но передумал. Я попробую, но не считается ли плохой практикой назначать переменные класса после определения класса? - person Benjamin; 25.08.2014
comment
К сожалению, это не работает, потому что сигнал должен быть определен в структуре класса, а не вне ее. В любом случае спасибо. - person Benjamin; 25.08.2014

Похоже, этот сигнал передает собственную переменную класса. Из ссылки на этот сигнал pyqt. Возможно использовать QObject. (не Foo, но подкласс тот же)

Или, если вы хотите передать какой-либо объект, я думаю, вы можете использовать object;

class Foo(QObject):
    updated = pyqtSignal(object)
    moved = pyqtSignal(object)

И вы можете указать, какой класс должен быть испущен в сигнале подключения pyqt.

person Kitsune Meyoko    schedule 25.08.2014
comment
Я поддержу этот ответ своим весом. Раньше я использовал pyqtSignal(object) для передачи объектов через сигналы. Я специально не делал этого, чтобы передать ссылку на экземпляр класса, сигнал которого определяет его (как вы хотите), но я не понимаю, почему это будет отличаться от того, что я сделал раньше. - person three_pineapples; 25.08.2014