如何检查 python 方法是否已绑定?
给定一个方法的引用,有没有办法检查该方法是否绑定到一个对象? 您还可以访问它绑定到的实例吗?
Given a reference to a method, is there a way to check whether the method is bound to an object or not? Can you also access the instance that it's bound to?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
同时适用于 Python 2 和 3 的解决方案很棘手。
使用包
six
,一种解决方案可能是:在 Python 2 中:
im_self
属性,因此six.get_method_self()
将引发AttributeError
并且返回False
im_self
属性将设置为None
,因此将返回False
im_self
code> 属性设置为非None
,因此这将返回True
在 Python 3 中:
__self__
属性,因此 < code>six.get_method_self() 将引发AttributeError
并返回False
False
__self__
属性(设置为非None
),因此这将返回True
A solution that works for both Python 2 and 3 is tricky.
Using the package
six
, one solution could be:In Python 2:
im_self
attribute sosix.get_method_self()
will raise anAttributeError
and this will returnFalse
im_self
attribute set toNone
so this will returnFalse
im_self
attribute set to non-None
so this will returnTrue
In Python 3:
__self__
attribute sosix.get_method_self()
will raise anAttributeError
and this will returnFalse
False
__self__
attribute set (to non-None
) so this will returnTrue
im_self
属性(仅限 Python 2)im_self
attribute (only Python 2)所选答案几乎在所有情况下都有效。 但是,当使用所选答案检查方法是否绑定在装饰器中时,检查将失败。 考虑这个示例装饰器和方法:
装饰器中的
print
语句将打印False
。在这种情况下,我找不到任何其他方法,只能使用参数名称检查函数参数并查找名为
self
的参数。 这也不保证完美地工作,因为方法的第一个参数不强制命名为self
并且可以具有任何其他名称。The chosen answer is valid in almost all cases. However when checking if a method is bound in a decorator using chosen answer, the check will fail. Consider this example decorator and method:
The
print
statement in decorator will printFalse
.In this case I can't find any other way but to check function parameters using their argument names and look for one named
self
. This is also not guarantied to work flawlessly because the first argument of a method is not forced to be namedself
and can have any other name.在 python 3 中,
__self__
属性仅在绑定方法上设置。 在普通函数(或未绑定方法,在 python 3 中只是普通函数)上,它没有设置为None
。使用这样的东西:
In python 3 the
__self__
attribute is only set on bound methods. It's not set toNone
on plain functions (or unbound methods, which are just plain functions in python 3).Use something like this:
用户定义的方法:
在 Python 2.6 和 3.0 中:
User-defined methods:
In Python 2.6 and 3.0: