我正在尝试获得班上所有方法的名称.在测试检查模块的工作方式时,我提出了我的一个方法obj = MyClass.__dict__['mymethodname'].
但现在inspect.ismethod(obj)返回False时inspect.isfunction(obj)返回True,我不明白为什么.是否有一些奇怪的方法将方法标记为我不知道的方法?我认为它只是在类中定义并self作为它的第一个参数.
您正在看到Python的幕后机制的一些影响.
当你写的时候f = MyClass.__dict__['mymethodname'],你得到了"mymethodname"的原始实现,这是一个普通的函数.要调用它,您需要传入一个额外的参数,类实例.
当你写f = MyClass.mymethodname(注意mymethodname之后没有括号)时,你得到一个MyClass类的未绑定方法,它是一个MethodType包装你在上面获得的原始函数的实例.要调用它,您需要传入一个额外的参数,类实例.
当你写f = MyClass().mymethodname(注意我在获取它的方法之前创建了一个MyClass类的对象)之后,你得到一个MyClass类的实例的绑定方法.您不需要将其他类实例传递给它,因为它已经存储在其中.
要通过以字符串形式给出的名称来获取包装方法(绑定或未绑定),请使用getattr,如gnibbler所述.例如:
unbound_mth = getattr(MyClass, "mymethodname")
Run Code Online (Sandbox Code Playgroud)
要么
bound_mth = getattr(an_instance_of_MyClass, "mymethodname")
Run Code Online (Sandbox Code Playgroud)