【问题标题】:PyGOBject referring to instance of same classPyGOBject 引用同一类的实例
【发布时间】:2014-12-27 00:17:03
【问题描述】:

我正在使用 PyGOBject 创建一个 Python3 应用程序,用于其 Gtk3Gstreamer 绑定。我的一个类需要有一个属性引用该类的同一类型(或子类)的实例

from gi.repository import GObject

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

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

    # ...

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

但是,python 解析器会针对这段特定的代码片段返回以下错误:

NameError: name 'Cue' is not defined

我猜这与 python 如何创建它的类有关,因为我能够创建一个不同的自定义类型的属性。

【问题讨论】:

  • 类的名称在类被完全定义之前是未知的。您可以在超级调用后在 init 方法中创建 autofollow_target

标签: python pygobject gobject


【解决方案1】:

在这里,您尝试在其内部使用类自己的名称。在 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)

注意:我没有测试过这个。

希望这很有用。

【讨论】:

  • 这会抛出 TypeError
  • 我测试了实现该技术的通用代码,它似乎工作正常@Padriac。你是说它会在gi 的上下文中抛出TypeError
  • 我可能是错的,但查看源代码似乎有一个self._type_from_python(type) 检查并且引发的错误是raise TypeError("Unsupported type: %r" % (type_,)),这也可能是因为一个函数不是预期的,但无论哪种方式我认为 OP 将与这种方法作斗争
  • @techwiz24,你应该从源代码pastebin.com/ZgpyaaGL看这个方法
  • 这里的解决方案不起作用的原因是因为 PyGObject 使用了一个自定义的元类,它在完全解析之后向 GObject 类型系统注册子类型。属性只能是已注册的 GType,而在使用时并非如此。顺便说一句,我会避免在 Python 类上使用自定义的“dunder”名称 (__class_name__)。
【解决方案2】:

诀窍是使用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)

我还没有弄清楚如何将属性指定为特定类型的对象,但我认为这可能是绑定本身的问题

【讨论】:

  • 请注意,使用 type=object 与 type=GObject.TYPE_OBJECT(或 type=GObject.Object)有点不同。前者使用“对象”实际上等价于 GObject.TYPE_PYOBJECT。使用“object”,any Python 对象是可以接受的,而使用 GObject.Object,只有 GObjects 可以工作,这可能更接近你想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多