相关疑难解决方法(0)

Python:绑定一个未绑定的方法?

在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的方式将未绑定的方法绑定到一个实例并继续传递它而不调用它?

python methods bind class

108
推荐指数
4
解决办法
4万
查看次数

为什么人们在__get__中将所有者参数默认为无?

我经常看到这个:

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 descriptor python-3.x python-descriptors

10
推荐指数
2
解决办法
458
查看次数

Python 描述符的 __get__ 中第三个参数 objtype 的用法是什么

我知道在 Python 中我们必须__get__在实现描述符时提供函数。界面是这样的:

def __get__(self, obj, objtype=None):
    pass
Run Code Online (Sandbox Code Playgroud)

我的问题是:

为什么我们必须提供objtypearg?是什么objtype用的?

我没有看到一些关于这个 arg 用法的例子。

python descriptor

6
推荐指数
1
解决办法
508
查看次数

“__get__”参数之一是多余的吗?

如此处所述:

https://docs.python.org/3/reference/datamodel.html#object.__get__

传递给 __get__ 方法的两个参数('self' 除外)分别是对象和访问属性的类。第二个论点不是多余的吗?此外,当“类”也是对象时,为什么需要区分对象和类访问?

所以,在我看来,有两种可能性:

  • 从对象访问属性,在这种情况下,所有者参数将等于type( instance ),因此它不会带来新信息
  • 从类(“类型”的对象)访问属性,在这种情况下,源对象仅位于所有者参数中,实例None

在我看来,如果只使用一个参数(例如instance)可以实现相同的功能,该参数将始终保存原始对象,无论它是否是“类”。如果确实需要该信息,则可以使用isinstance(instance, type).

那么,为什么需要两个参数呢?

python python-descriptors

5
推荐指数
1
解决办法
119
查看次数

为什么 __get__ 拥有一个所有者而 __set__ 和 __delete__ 没有?

来自 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__

  • 我们可以得到一个属性,无论它是属于所有者类的实例还是属于所有者类,
  • 我们可以在属性属于所有者类的实例时设置和删除属性,但在属于所有者类时不能设置和删除属性?

我的问题实际上是这个问题的一部分。

python attributes datamodel python-descriptors

3
推荐指数
1
解决办法
508
查看次数