我已經發布了你問的問題的答案。但是你不應該爲了解決你的問題而不得不去理解new.instancemethod
。發生的唯一原因是因爲你提出了錯誤的問題。讓我們看看你應該已經問了,爲什麼。
In PySide.QtGui, I want the list widget items to have methods to set the font and colors, and they don't seem to.
這就是你真正想要的。可能有一個簡單的方法來做到這一點。如果是這樣,那就是你想要的答案。另外,從這開始,你可以避免所有關於「你真正想做什麼?」的評論。或者「我懷疑這適用於你想要做的任何事情」(這往往伴隨着降低成本 - 或者更重要的是,潛在的答覆者會忽略你的問題)。
Of course I could just write a function that takes a QListWidgetItem and call that function, instead of making it a method, but that won't work for me because __.
我認爲有一個原因,不會爲你工作。但我真的不能想到一個好的。代碼不管行對此表示:
item.setColor(color)
反而會這樣說:
setItemColor(item, color)
很簡單。
即使您需要,例如繞過一個顏色設置委託,並將項綁定到該委託中,對於函數和方法來說,這幾乎是一樣容易。取而代之的是:
delegate = item.setColor
是:
delegate = lambda color: setItemColor(item, color)
所以,如果有是你需要這是一個方法,一個很好的理由,這東西你真的應該解釋一下。如果你幸運的話,結果會證明你錯了,做你想做的事情的方式比你想要的要簡單得多。
The obvious way to do this would be to get PySide to let me specify a class or factory function, so I could write a QListWidgetItem subclass, and every list item I ever deal with would be an instance of that subclass. But I can't find any way to do that.
這看起來應該是PySide的一個特性。所以也許是,在這種情況下你想知道。如果不是,也不是任何評論者或回答者都可以想到一個好的理由,那就是設計不好或者很難實現,你應該提交一個功能請求,它可能在下一個版本中。 (不,這可以幫助你,如果你需要在下週發佈的代碼針對當前的版本,但它仍然是值得做的事情。)
Since I couldn't find a way to do that, I tried to find some way to add my setColor
method to the QListWidgetItem
class, but couldn't think of anything.
猴修補類是非常簡單的:
QListWidgetItem.setColor = setItemColor
如果您不知道你能做到這一點,沒關係。如果人們知道這就是你想要做的,這將是他們建議的第一件事。 (好吧,也許並不是很多Python程序員對猴子修補知道得太多,但它仍然比知道描述符或new.instancemethod
的人數多得多。)而且,除了作爲答案之外,你會更快,更輕鬆,它是一個更好的答案。
即使你知道這一點,一些擴展模塊也不會讓你這樣做。如果你嘗試過,但失敗,說明什麼也沒有工作,而不是:
PySide wouldn't let me add the method to the class; when I try monkey-patching, __.
也許有人知道爲什麼它沒有工作。如果沒有,至少他們知道你嘗試過。
So I have to add it to every instance.
猴修補情況是這樣的:
myListWidgetItem.setColor = setItemColor
如此反覆,你會得到一個快速的答案,一個更好的。
但是,也許你知道,而且試了一下,並沒有工作,要麼:
PySide also wouldn't let me add the method to each instance; when I try, __.
So I tried patching out the __class__
of each instance, to make it point to a custom subclass, because that works in PyQt4, but in PySide it __.
這可能不會讓你有用的東西,因爲它只是PySide的工作方式。但值得一提的是,你嘗試過。
So, I decided to create that custom subclass, then copy its methods over, like so, but __.
一路下來,這裏是你放置原始問題的所有東西。如果真的有必要解決您的問題,信息將在那裏。但是,如果有一個簡單的解決方案,你就不會得到一些人只是猜測new.instancemethod
如何工作的困惑的答案。
'A'的定義不正確 - 它的'aFunction()'方法不起作用。 – Tadeck
使該方法靜態。 –
對不起,應該是 def aFunction(self): 雖然我仍然得到相同的錯誤。 – ninhenzo64