Python如何工作:如何检查.inspect.ismethod?

2024-09-28 22:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获取类中所有方法的名称。 在测试inspect模块如何工作时,我通过obj = MyClass.__dict__['mymethodname']提取了一个方法。在

但是现在inspect.ismethod(obj)返回False,而{}返回{},我不明白为什么。有没有什么奇怪的方法可以将方法标记为我不知道的方法?我认为它只是在类中定义的,并以self作为第一个参数。在


Tags: 模块方法标记self名称falseobj参数
3条回答

使用源代码

def ismethod(object):
    """Return true if the object is an instance method.

    Instance method objects provide these attributes:
        __doc__         documentation string
        __name__        name with which this method was defined
        im_class        class object in which this method belongs
        im_func         function object containing implementation of method
        im_self         instance to which this method is bound, or None"""
    return isinstance(object, types.MethodType)

第一个参数是self,这只是惯例。通过从类的dict按名称访问方法,您将绕过绑定,因此它看起来是一个函数而不是一个方法

如果要按名称访问方法,请使用

^{pr2}$

那么,你的意思是obj.mymethod是一个方法(隐式传递了self),而{}是一个函数吗?在

基本上,Klass.__dict__['mymethod']是“raw”函数,它可以由一个叫做描述符的东西转换成一个方法。这意味着类上的每个函数都可以是普通函数和方法,这取决于您如何访问它们。这就是类系统在Python中的工作方式,非常正常。在

如果您想要方法,就不能通过__dict__(无论如何,您永远不应该这样做)。要获得所有方法,您应该执行inspect.getmembers(Klass_or_Instance, inspect.ismethod)

您可以阅读details here,关于这一点的解释在“用户定义方法”下。在

您将看到Python幕后机制的一些效果。在

当您编写f = MyClass.__dict__['mymethodname']时,您将得到“mymethodname”的原始实现,这是一个普通函数。要调用它,需要传入一个附加参数class instance。在

当您编写f = MyClass.mymethodname(注意mymethodname后面没有括号),您将得到一个类MyClass的未绑定方法,它是MethodType的一个实例,它包装了上面获得的原始函数。要调用它,需要传入一个附加参数class instance。在

当您编写f = MyClass().mymethodname(请注意,在使用MyClass的方法之前,我已经创建了一个类MyClass的对象),您将得到一个类MyClass实例的绑定方法。您不需要向它传递额外的类实例,因为它已经存储在其中。在

{{a1>用一个名为^的非绑定}方法来命名。例如:

unbound_mth = getattr(MyClass, "mymethodname")

或者

^{pr2}$

相关问题 更多 >