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
,这就是区分绑定方法和未绑定方法的方式