2014-12-27 10 views
1

Я создаю приложение Python3 с использованием PyGOBject для его привязок Gtk3 и Gstreamer. Один из моих классов должны иметь свойство, которое относится к экземпляру того же типа (или подкласса) классаPyGOBject ссылается на экземпляр того же класса

from gi.repository import GObject 

class Cue(GObject.GObject): 
    # ... 

    autofollow_target = GObject.Property(type=Cue, default=None) 

    # ... 

    def __init__(self): 
     GObject.GObject.__init__(self) 

Однако питон анализатор возвращает следующее сообщение об ошибке для этого конкретного Snippit кода:

NameError: name 'Cue' is not defined 

Я предполагаю, что это имеет какое-то отношение к тому, как python создает свои классы, потому что мне удалось создать свойство другого пользовательского типа.

+0

Имя класса неизвестно до того, как класс полностью определен. вы можете создать autofollow_target в методе __init__ после супервызов – laltin

ответ

0

Хитрость заключается в том, чтобы использовать gobject.TYPE_OBJECT или просто object для информации типа:

from gi.repository import GObject 

class Cue(GObject.GObject): 
    # ... 

    autofollow_target = GObject.Property(type=object) 

    # ... 

    def __init__(self): 
     GObject.GObject.__init__(self) 

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

+0

Обратите внимание, что использование типа = object немного отличается от типа = GObject.TYPE_OBJECT (или type = GObject.Object). Первый из «объекта» на самом деле эквивалентен GObject.TYPE_PYOBJECT. С «объектом» * любой * объект Python приемлем, тогда как с GObject.Object будут работать только GObjects, что, вероятно, ближе к тому, что вы хотите. –

0

Здесь вы пытаетесь использовать собственное имя класса внутри себя. В Python имя класса неизвестно до того, как класс полностью определен/создан.

Один из способов для того же самого можно добавлять это в своем классе, прежде чем присваивать ваше имущество, а затем вызвать этот метод свойства:

@property 
def __class_name__(cls): 
    return type(cls) 

Так что ваш код будет:

from gi.repository import GObject 

class Cue(GObject.GObject): 
    # ... 

    @property 
    def __class_name__(cls): 
     return type(cls) 

    autofollow_target = GObject.Property(type=__class_name__, default=None) 

    # ... 

    def __init__(self): 
     GObject.GObject.__init__(self) 

Примечание: Я не тестировал это.

Надеюсь, что это было полезно.

+0

Это вызовет TypeError –

+0

. Я протестировал общий код, реализующий эту технику, и, похоже, он отлично работает @Padriac. Вы говорите, что он будет бросать 'TypeError' в контексте' gi'? – kartikg3

+0

Да, насколько я вижу, принимаются только определенные типы –

Смежные вопросы