将C对象实例更改为Python子类

2024-10-02 00:43:24 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以将C对象的类更改为python子类?

我使用PyGTK,我有一个ListModel,我已经将自己的类打包了,但是我想将它转换为TreeModelFilter。这些说明告诉我通过以下操作创建它:

class MyListStore(gtk.ListStore):
  def __init__(self, title):
    self.title = title

liststore = MyListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
modelfilter = liststore.filter_new()

所以我想我可以创造:

^{pr2}$

但是我不知道如何使用过滤器来使用我的类,而不是gtk.TreeModelFilter.


Tags: 对象selfgtktitledeftype子类class
2条回答

继承在python中是一个非常灵活的概念。对于初学者,应该始终使用新样式类。为此,请确保您的类应该始终从“object”继承。在

需要注意的是,类必须从其他类继承,而不是从其他类的实例继承,因此您的示例在那里真的不起作用。事实上,我真的看不出从X或x1继承的区别。在

python中的继承与“方法解析顺序”(methodresolutionorder,MRO)密切相关。您可以使用inspect模块查看对象MRO。在

>>> import inspect
>>> import pprint
>>>
>>> class X(object):
...     pass
...
>>> class Y(X):
...     pass
...
>>>
>>> pprint.pprint(inspect.getmro(Y))
(<class '__main__.Y'>, <class '__main__.X'>, <type 'object'>)
>>> 

末尾的元组显示了python尝试解析方法和属性调用的顺序。可以通过修改类的__bases__属性在运行时修改MRO。在

^{pr2}$

如果您的任何类使用多重继承,或者您希望保留继承树的某些部分而不保留其他部分,则这可能会变得复杂。在

处理此问题的最佳方法不是将TreeModel子类化,而是为对象分配一个变量,该对象可以是ListStore或TreeModelFilter。在

class MyListStore(object):
  def __init__(self, title, filter=None):
    self.title = title
    self._model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
    if filter_func:
      self._model = self.model.filter_new()
      self._model.set_visible_func(filter)

我认为这是解决这个问题的最好办法。在

编辑

对于任何感兴趣的人,我发现以下内容有助于避免破坏旧代码。它的行为就像是继承,实际上却没有这样做:

^{pr2}$

相关问题 更多 >

    热门问题