我已经发布了对您提出的问题的答案。但是你不应该不得不降低到必须理解new.instancemethod
来解决你的问题的水平。发生这种情况的唯一原因是你问错了问题。让我们看看你应该问什么,以及为什么。
在 PySide.QtGui 中,我希望列表小部件项具有设置字体和颜色的方法,但它们似乎没有。
这才是你真正想要的。很可能有一种简单的方法可以做到这一点。如果是这样,这就是你想要的答案。此外,从这个开始,你可以避免所有关于“你真正想做什么?”的评论。或“我怀疑这是否适合您尝试做的任何事情”(这通常伴随着反对票,或者更重要的是,潜在的回答者只是忽略了您的问题)。
当然,我可以只编写一个带有 QListWidgetItem 的函数并调用该函数,而不是使其成为一个方法,但这对我不起作用,因为_。
我认为有一个对你不起作用的原因。但我真的想不出一个好的。无论哪一行代码都是这样说的:
item.setColor(color)
相反会这样说:
setItemColor(item, color)
很简单。
即使您需要,例如,传递一个绑定了项目的颜色设置委托,使用函数和使用方法几乎一样容易。而不是这个:
delegate = item.setColor
它的:
delegate = lambda color: setItemColor(item, color)
因此,如果您有充分的理由需要将其作为一种方法,那么您确实应该解释一下。如果你很幸运,结果会证明你错了,而且有一种比你尝试的方法更简单的方法来做你想做的事。
显而易见的方法是让 PySide 让我指定一个类或工厂函数,这样我就可以编写一个 QListWidgetItem 子类,而我曾经处理过的每个列表项都是该子类的一个实例。但我找不到任何方法来做到这一点。
这似乎应该是 PySide 的一个特性。所以也许是这样,在这种情况下你想知道。如果不是,并且您或任何评论者或回答者都无法想出一个很好的理由,它是糟糕的设计或难以实现,您应该提交一个功能请求,它可能会出现在下一个版本中。(如果您需要在下周针对当前版本发布代码,这并不是说这对您有帮助,但仍然值得这样做。)
由于我找不到这样做的方法,我试图找到某种方法将我的setColor
方法添加到QListWidgetItem
类中,但想不出任何东西。
猴子修补类非常简单:
QListWidgetItem.setColor = setItemColor
如果你不知道你可以做到这一点,那很好。如果人们知道这就是你想要做的,这将是他们建议的第一件事。(好吧,也许没有多少 Python 程序员对猴子补丁了解很多,但它仍然比了解描述符或new.instancemethod
.更好的答案。
即使您确实知道这一点,某些扩展模块也不会让您这样做。如果您尝试过但失败了,请解释什么不起作用:
PySide 不允许我将方法添加到类中;当我尝试修补猴子时,_ _。
也许有人知道为什么它不起作用。如果没有,至少他们知道你试过了。
所以我必须将它添加到每个实例中。
猴子修补实例如下所示:
myListWidgetItem.setColor = setItemColor
同样,您会得到一个快速的答案,而且是一个更好的答案。
但也许你知道这一点,并尝试过,但它也没有奏效:
PySide 也不允许我将方法添加到每个实例;当我尝试时,_ _。
所以我尝试修补__class__
每个实例,使其指向一个自定义子类,因为这在 PyQt4 中有效,但在 PySide 中它_ _。
这可能不会为您带来任何有用的东西,因为这正是 PySide 的工作方式。但值得一提的是你试过了。
所以,我决定创建那个自定义子类,然后复制它的方法,就像这样,但是_。
一直到这里,您将在原始问题中放入所有内容。如果确实有必要解决您的问题,那么信息就在那里。但是,如果有一个简单的解决方案,您就不会从那些只是猜测其工作原理的人那里得到一堆令人困惑的答案new.instancemethod
。