在Python中,有没有办法绑定未绑定的方法而不调用它?
我正在编写一个wxPython程序,对于某个类,我认为将所有按钮的数据组合在一起作为类级别的元组列表是很好的,如下所示:
class MyWidget(wx.Window):
buttons = [("OK", OnOK),
("Cancel", OnCancel)]
# ...
def Setup(self):
for text, handler in MyWidget.buttons:
# This following line is the problem line.
b = wx.Button(parent, label=text).Bind(wx.EVT_BUTTON, handler)
Run Code Online (Sandbox Code Playgroud)
问题是,由于所有的值handler
都是未绑定的方法,我的程序在一个壮观的火焰中爆炸,我哭泣.
我在网上寻找解决方案似乎应该是一个相对简单,可解决的问题.不幸的是我找不到任何东西.现在,我正在functools.partial
尝试解决这个问题,但有没有人知道是否有一种干净,健康,Pythonic的方式将未绑定的方法绑定到一个实例并继续传递它而不调用它?
我经常看到这个:
def __get__(self, instance, owner=None):
Run Code Online (Sandbox Code Playgroud)
为什么有些人使用的默认值None
的的owner
参数?
这甚至可以在Python文档中完成:
descr.__get__(self, obj, type=None) --> value
Run Code Online (Sandbox Code Playgroud) 我知道在 Python 中我们必须__get__
在实现描述符时提供函数。界面是这样的:
def __get__(self, obj, objtype=None):
pass
Run Code Online (Sandbox Code Playgroud)
我的问题是:
为什么我们必须提供objtype
arg?是什么objtype
用的?
我没有看到一些关于这个 arg 用法的例子。
如此处所述:
https://docs.python.org/3/reference/datamodel.html#object.__get__
传递给 __get__ 方法的两个参数('self' 除外)分别是对象和访问属性的类。第二个论点不是多余的吗?此外,当“类”也是对象时,为什么需要区分对象和类访问?
所以,在我看来,有两种可能性:
在我看来,如果只使用一个参数(例如instance)可以实现相同的功能,该参数将始终保存原始对象,无论它是否是“类”。如果确实需要该信息,则可以使用isinstance(instance, type)
.
那么,为什么需要两个参数呢?
来自 Python数据模型文档:
object.__get__(self, instance, owner=None)
调用以获取所有者类的属性(类属性访问)或该类的实例的属性(实例属性访问)。可选
owner
参数是所有者类,而instance
属性是通过其访问的实例,或者None
是通过owner
.此方法应返回计算出的属性值或引发
AttributeError
异常。PEP 252 指定可以
__get__()
使用一个或两个参数调用。Python 自己的内置描述符支持这个规范;但是,某些第三方工具可能具有需要两个参数的描述符。__getattribute__()
无论是否需要,Python 自己的实现总是传入这两个参数。
object.__set__(self, instance, value)
调用以将
instance
所有者类的实例上的属性设置为新值 value。请注意,将描述符的种类添加
__set__()
或__delete__()
更改为“数据描述符”。有关更多详细信息,请参阅调用描述符。
object.__delete__(self, instance)
调用以删除
instance
所有者类的实例上的属性。
为什么__get__
需要一段owner
时间__set__
而__delete__
没有?
这是否意味着当描述符同时提供__get__
和时__set__
,
我的问题实际上是这个问题的一部分。