在问题如何找到 Python 函数的参数数量?给出的代码显示了如何使用inspect.getfullargspec获取函数的信息。但是,有什么方法可以验证函数的参数之一是否为self?是否可以self通过以某种方式检查给定函数的第一个参数是否是对方法对象的引用来确定第一个方法参数是否是Python 2?
例如,函数中的第一个参数在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
Run Code Online (Sandbox Code Playgroud)
然而,lambda self: self+1尽管有人邪恶并且命名参数,但函数中的第一个参数self实际上并没有self在 Python 对象中使用。
如果我们从参数检查中退后一步,将这个问题视为确定函数是否是方法的问题。我们可以用这个inspect.ismethod函数来做到这一点:
>>> import inspect
>>> class Foo:
... def bar(self):
... pass
...
>>> inspect.ismethod(Foo().bar)
True
Run Code Online (Sandbox Code Playgroud)
如果函数是绑定方法,我们可以安全地假设传递给该方法的第一个参数是self.
请注意,在 Python 2.X 中,对于未绑定的方法(例如Foo.bar),这将返回 True,而在 3.X 中,仅当方法已绑定时,它才会返回 True。
我们可以通过使用getmembers更进一步,并实际确定self此绑定方法的值是什么:
>>> dict(inspect.getmembers(Foo()))["bar"].__self__
<__main__.Foo object at 0x7f601eb50a58>
Run Code Online (Sandbox Code Playgroud)
它返回Foo()此bar方法绑定到的实例。在Python 2.X,__self__将是None如果实例是未绑定的,这是你绑定和非绑定方法之间如何区分。