Python中的 inspect.ismethod方法

87 阅读2分钟

在Python中,使用inspect模块可以检查对象是否是方法。但是,有时会遇到inspect.ismethod(obj)返回False,而inspect.isfunction(obj)返回True的情况。这是因为Python中的方法有不同的表示形式,包括原始函数、未绑定方法和绑定方法。原始函数是方法的底层实现,它不包含任何关于类或实例的信息。未绑定方法是原始函数的包装器,它包含指向类或实例的引用。绑定方法是未绑定方法的包装器,它包含指向类或实例的引用,并已经与特定的类或实例绑定。

huake_00152_.jpg 2. 解决方案 1. 使用getattr()获取方法 要获取方法的未绑定方法或绑定方法,可以使用getattr()函数。例如,以下代码获取MyClass类的mymethodname方法的未绑定方法: http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取; unbound_mth = getattr(MyClass, "mymethodname")

    以下代码获取一个MyClass类的实例的mymethodname方法的绑定方法:
    ```
    bound_mth = getattr(an_instance_of_MyClass, "mymethodname")
    ```
2. **使用inspect.ismethod()检查方法** 
    可以使用inspect.ismethod()函数检查对象是否是方法。inspect.ismethod()函数返回True,如果对象是一个方法,否则返回False。例如,以下代码检查unbound_mth是否是方法:
    ```
    inspect.ismethod(unbound_mth)
    ```
    这将返回True,因为unbound_mth是mymethodname方法的未绑定方法。
    
    以下代码检查bound_mth是否是方法:
    ```
    inspect.ismethod(bound_mth)
    ```
    这也将返回True,因为bound_mth是mymethodname方法的绑定方法。

3. **使用inspect.isfunction()检查函数**
    可以使用inspect.isfunction()函数检查对象是否是函数。inspect.isfunction()函数返回True,如果对象是一个函数,否则返回False。例如,以下代码检查MyClass类的mymethodname方法的原始函数是否是函数:
    ```
    inspect.isfunction(MyClass.__dict__['mymethodname'])
    ```
    这将返回True,因为MyClass.__dict__['mymethodname']是mymethodname方法的原始函数。

4. **使用inspect.getmembers()获取所有方法** 
    可以使用inspect.getmembers()函数获取所有方法。inspect.getmembers()函数返回一个包含所有方法的列表,这些方法是inspect.ismethod()返回True的。例如,以下代码获取MyClass类的所有方法:
    ```
    inspect.getmembers(MyClass, inspect.ismethod)
    ```
    这将返回一个列表,其中包含MyClass类的所有方法。

以下是一个代码示例,演示了如何使用inspect.ismethod()和inspect.isfunction()来检查对象是否是方法或函数:

class MyClass:
    def mymethodname(self):
        pass

obj = MyClass.__dict__['mymethodname']

print(inspect.ismethod(obj))  # False
print(inspect.isfunction(obj))  # True

输出:

False
True

在这个示例中,obj是MyClass.dict['mymethodname']的返回值,它是一个原始函数。因此,inspect.ismethod(obj)返回False,因为obj不是一个方法。相反,inspect.isfunction(obj)返回True,因为obj是一个函数。