如何获得非绑定类方法?
class Foo:
@classmethod
def bar(cls): pass
>>> Foo.bar
<bound method type.bar of <class '__main__.Foo'>>
编辑:这里是python 3.抱歉搞混了.
如何获得非绑定类方法?
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_class
是classobj
,虽然这不是Foo.__class__
,但这似乎是一个骗局,但这似乎是让旧样式和新样式的类在所有常见用例中都能以类似方式工作的最合理的方法.