Python 确定方法中的参数是否为";“自我”;

Python 确定方法中的参数是否为";“自我”;,python,python-2.7,Python,Python 2.7,问题中给出了代码,说明如何使用inspect.getfullargspec获取函数信息。但是,是否有任何方法可以验证函数的参数之一是否为self?是否可以通过某种方式检查给定函数的第一个参数是否是对方法对象的引用来确定第一个方法参数是否是selfpython2 例如,函数step中的第一个参数在技术上是self,即使有人决定作恶并将self重命名为what class TestNode(object): def __init__(what, bias=0): what.

问题中给出了代码,说明如何使用
inspect.getfullargspec
获取函数信息。但是,是否有任何方法可以验证函数的参数之一是否为
self
?是否可以通过某种方式检查给定函数的第一个参数是否是对方法对象的引用来确定第一个方法参数是否是
self
python2

例如,函数
step
中的第一个参数在技术上是
self
,即使有人决定作恶并将
self
重命名为
what

class TestNode(object):

    def __init__(what, bias=0):
        what.bias = bias

    def update(what, t, x):
        return t / x * what.bias

但是,函数
lambda-self:self+1
中的第一个参数实际上不是Python对象中使用的
self
,尽管有人很邪恶,并命名了一个参数
self

self
不是特殊参数。名称
self
没有任何特殊之处-它与其他参数一样是一个正常参数,它被命名为
self
的唯一原因是程序员之间的约定

您无法将
self
参数与其他参数区分开来,因为它根本没有区别

您可以做的是检查函数是否是类的成员-然后它将成为一个方法并自动获取实例作为第一个参数-这是通过元类描述符来完成的,如您所见


如果
inspect.ismethod()
返回
True
,则传递给函数的第一个参数将是实例,而不管其名称如何。

如果我们从参数检查后退一步,并将此问题视为确定函数是否为方法的问题。我们可以通过以下功能完成此操作:

>>> import inspect
>>> class Foo:
...     def bar(self):
...         pass
...
>>> inspect.ismethod(Foo().bar)
True
如果函数是绑定方法,我们可以安全地假设此方法的第一个传递参数是
self

请注意,在Python2.X中,对于未绑定的方法(例如
Foo.bar
),它将返回True,而在3.X中,只有当方法被绑定时,它才会返回True

我们可以进一步使用并实际确定此绑定方法的
self
值:

>>> dict(inspect.getmembers(Foo()))["bar"].__self__
<__main__.Foo object at 0x7f601eb50a58>
dict(inspect.getmembers(Foo())[“bar”]。\uu self__ 它返回此
bar
方法绑定到的
Foo()
实例。在Python2.X中,如果实例是未绑定的,
\uuuuu self\uuu
将是
None
,这就是区分绑定方法和未绑定方法的方式