Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C对象实例更改为Python子类_Python_Inheritance_Pygtk - Fatal编程技术网

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

将C对象实例更改为Python子类,python,inheritance,pygtk,Python,Inheritance,Pygtk,是否可以将C对象的类更改为python子类 我正在使用PyGTK,我有一个ListModel,我已经包装了自己的类,但是我想把它变成一个TreeModelFilter。说明告诉我如何通过以下方式创建: class MyListStore(gtk.ListStore): def __init__(self, title): self.title = title liststore = MyListStore(gobject.TYPE_INT, gobject.TYPE_STRING)

是否可以将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()
所以我想我可以创造:

class MyFilteredListStore(gtk.TreeModelFilter):
  def __init__(self, title):
    self.title = title

但是我不知道如何使用filter\u new来使用我的类,而不是gtk.TreeModelFilter。

继承在python中是一个非常流畅的概念。首先,您应该始终使用新样式类。为此,请确保类始终从“对象”继承

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)
重要的是要注意,类必须从其他类继承,而不是从其他类的实例继承,因此您的示例在这里不起作用。事实上,我并没有看到从X或x1继承的区别

python中的继承与“方法解析顺序”(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'>)
>>> 

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

处理此问题的最佳方法不是对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)
我认为这是最好的解决办法

编辑 对于任何感兴趣的人,我发现以下内容有助于防止破坏旧代码。它的行为类似于继承,但实际上并没有这样做:

  def __getattr__(self, name):
    'Get the attribute from the model if possible.'
    if hasattr(self._model, name):
      return getattr(self._model, name)
    if isinstance(self._model, gtk.TreeModelFilter):
      if hasattr(self._model.get_model(), name):
        return getattr(self._model.get_model(), name)

@agf这是一个更好的标题吗?更多的是关于一般Python的父/子级,但PyGTK只是给出一个示例。这个问题很接近,但我可能想在我自己的程序中使用init。我还没决定,你在问什么?如何获取已存在的类实例,并将其更改为其类的子类的实例?或者,如何获取一个方法来返回一个不同于它所写入的类型?第一个问题的答案是“切换
\uuuu类”\uuuuu
,第二个问题的答案是“重写方法”。不管是什么,你现在的头衔并不比以前的好多少;也许你们的意思是“从它通常的父类的子类中创建类实例”或者类似的东西?别提问题2153295。我不能分配给类,因为对象是在C中定义的。如果没有答案(我自己也不能回答),我如何处理问题?我想我可以走另一条路来解决我的问题。我是删除这个问题,还是只选择可用的最好的?好吧,Python程序员没有直接创建TreeModelFilter的方法,因此,我想将实例从一个对象转换为该对象的子类。很遗憾,我无法更改类。@bradlis7:如果您在TreeModelFilter方面有问题,请打开一个新问题,显示您尝试运行的代码段,我们将认真研究它!