3

在问题中如何找到 Python 函数的参数数量?给出的代码展示了如何使用inspect.getfullargspec来获取函数的信息。但是,有什么方法可以验证函数的参数之一是否为selfself是否可以通过某种方式检查给定函数的第一个参数是否是对该方法对象的引用来识别第一个方法参数是否是Python 2?

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

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尽管有人邪恶并命名了一个参数,但函数中的第一个参数self实际上并不是selfPython 对象中的使用。

4

2 回答 2

5

如果我们从参数检查中退后一步,将这个问题视为确定函数是否是方法的问题。我们可以使用以下inspect.ismethod函数来做到这一点:

>>> import inspect
>>> class Foo:
...     def bar(self):
...         pass
...
>>> inspect.ismethod(Foo().bar)
True

如果函数是绑定方法,我们可以安全地假设第一个传递给该方法的参数是self.

请注意,在 Python 2.X 中,这将为未绑定的方法(例如Foo.bar)返回 True,而在 3.X 中,仅当方法被绑定时才会返回 True。

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

>>> dict(inspect.getmembers(Foo()))["bar"].__self__
<__main__.Foo object at 0x7f601eb50a58>

它返回Foo()bar方法绑定到的实例。在 Python 2.X 中,如果实例未绑定,__self__则将None是,这是您区分绑定和未绑定方法的方式。

于 2018-07-04T17:05:58.073 回答
1

self不是一个特殊的论点。这个名字self没有什么特别之处——它和其他参数一样是一个普通的参数,它被命名的唯一原因是self程序员之间的约定。

你无法将一个self论点与其他论点区分开来,因为它根本没有区别!

你可以做的是检查函数是否是一个类的成员 - 然后它变成一个方法,并自动将实例作为第一个参数 - 这是由元类描述符完成的,正如你在文档中看到的那样。

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

于 2018-07-04T17:00:37.000 回答