如何获得非绑定类方法?

class Foo:
    @classmethod
    def bar(cls): pass

>>> Foo.bar
<bound method type.bar of <class '__main__.Foo'>>

编辑:这里是python 3.抱歉搞混了.

推荐答案

Python 3没有未绑定的方法.暂时忘掉classmethod秒,看看这个:

>>> class Foo:
...     def baz(self): pass
>>> Foo.baz
<function __main__.baz>

在2.x、 这将是<unbound method Foo.baz>,但3.x没有未绑定的方法.

如果要从绑定方法中获取函数,这很简单:

>>> foo = Foo()
>>> foo.baz
<bound method Foo.baz of <__main__.Foo object at 0x104da6850>>
>>> foo.baz.__func__
<function __main__.baz>

同样地:

>>> class Foo:
...     @classmethod
...     def bar(cls): pass
>>> Foo.bar
<bound method type.bar of <class '__main__.Foo'>>
>>> Foo.bar.__func__
<function __main__.bar>

在2中,事情要有趣得多.x、 因为实际上有are个未绑定的方法可以获取.你通常看不到一个未绑定的classmethod,因为关键是它们在类创建时绑定到类,而不是在实例创建时保持未绑定,然后绑定到每个实例.

但实际上,一个未绑定的方法就是任何instancemethod,其im_self为None.所以,正如你能做到的:

class Foo(object):
    def baz(self): pass

foo = Foo()
bound_baz = foo.baz
unbound_baz = new.instancemethod(bound_baz.im_func, None, bound_baz.im_class)

请注意,bound_baz.im_func是2.x版本的bound_baz.__func__英寸3.但是new.instancemethod没有3.x当量.

文件上说new是不推荐的,而types是3.x兼容性,事实上,你可以在2.x:

unbound_baz = types.MethodType(bound_baz.im_func, None, bound_baz.im_class)

但这在第三种情况下是行不通的.x、 因为MethodType不接受class参数,并且不允许其instance参数为None.就我个人而言,当我在做一件明确的事情时.仅限x,不能移植到3.x、 我认为使用new更清晰.

不管怎样,在2节课上.x、 你可以这样做:

class Foo(object):
    @classmethod
    def bar(cls): pass

bound_bar = Foo.bar
unbound_bar = new.instancemethod(bound_bar.im_func, None, bound_bar.im_class)

如果你把它打印出来,你会看到:

<unbound method type.bar>

或者,用你的例子,用一个老式的类:

class Foo:
    @classmethod
    def bar(cls): pass

<unbound method classobj.bar>

是的,对于一个旧样式的类来说,classmethod中的im_classclassobj,虽然这不是Foo.__class__,但这似乎是一个骗局,但这似乎是让旧样式和新样式的类在所有常见用例中都能以类似方式工作的最合理的方法.

Python-3.x相关问答推荐

将strid()映射到Pandas DataFrame中的字符串不会更改NaN条目,但仍然声称它们不同?

如何从枚举中获取某个值?

我没有';无法理解此TemplateDoesNotExist错误

根据第一个字典的值序列对第二个字典进行排序

GUI 仍然有效并且没有错误消息时图形意外冻结 |具有多线程的 Pyside6 和 pyqtgraph (Python 3.11.4)

基于其他列的条件向Panda数据框中添加值到新列

pytorch 中 mps 设备的 manual_seed

获取字符串中的两个工作日之间的差异

为什么 numpy 的 `np.char.encode` 会将一个空的 unicode 数组变成一个空的 `float64` 数组?

判断 gekko 中的表达式

对齐文本文件中的列

将变量传递给 Google Cloud 函数

为什么Pandas会在 NaN 上合并?

如何使我的课程在 Python 中非常可打印?

pythondecorator中的变量范围

如何为 Python 中的线程设置异步事件循环?

迭代器也是可迭代的吗?

如何等待 create_task() 创建的任务完成?

计算两个文件的行差异的最有效方法是什么?

在 Meta 中创建具有动态模型的通用序列化程序