专栏首页python3Python判断对象是否是functio

Python判断对象是否是functio

在Python中,判断一个对象是否是方法有如下三种方法。

1. 根据“__call__”属性判断

有时候用python就有这么一种感悟,各种钩子函数就是通过内置的“__”属性实现,python学得好不好,就是对“__”属性理解得透彻不透彻。

python函数在调用时,一定会首先调用其相关“__call__”函数(没有空格),请参见python总结(四):类装饰器与方法的动态添加中的用法。

add = lambda a, b: a + b
#   判断成功
if(hasattr(add, '__call__')):
        print add(1,2)

2. 利用callable判断

这是一个据传快要废弃的方法,但是在Python 2中依旧很好用,如下:

#   判断成功
if(callable(add)):
        print add(2, 2)

3. 利用isfunction进行判断

Python的inspect模块包含了大量的与反射、元数据相关的工具函数,isfunction就是其中一种,使用方法如下:

from inspect import isfunction
#   判断成功
if(isfunction(add)):
    print add(5, 5)

4. 无效的types.MethodType

出人意料的是types.MethodType竟然无效(版本2.7.14),如下:

import types
#   竟然无效
if(isinstance(add, types.MethodType)):
    print add.__name__

在这个引申过程中,还发现了一些有意思的现象,不同的function的输出结果不一样:

>>> type(format)
<type 'builtin_function_or_method'>
>>> type(add)
<type 'function'>

更有意思的是,type竟然无法对print进行操作,如下:

>>> type(print)
  File "<stdin>", line 1
    type(print)
             ^
SyntaxError: invalid syntax

那print是什么?

结论

如何判断一个对象是否是方法,本文提供了3种方法,并发现了一些有意思的现象,再问一遍,print是什么?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python自动化开发学习1

    四、变量。虽然驼峰规则也行,但是python推荐用_下划线,那就用下划线把。变量名全大写表示常量

    py3study
  • 【Python3】Python函数

    作用域即范围(作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关) 查看作用域:globals(),locals()

    py3study
  • python3 引号中嵌套引号

    我们有时候需要在引号中嵌套引号。例如输入一段完整的代码print(str+'你好'),而代码中有引号。

    py3study
  • Python学习笔记之Super函数

    Jetpropelledsnake21
  • 贷款诈骗 x 摸版0day + 实战预警脚本

    挖掘贷款摸版漏洞--》发现同摸版网站--》利用漏洞数据解析整理 --》 输入预警受害人!!

    徐焱
  • Python学习之条件,判断,循环语句学习 原

    用户2603479
  • 计算机基础,Python基础--变量以及简单的循环

    一、计算机基础 1.CPU   相当于人体的大脑,用于计算处理数据。 2.内存    用于存储数据,CPU从内存调用数据处理计算,运算速度很快。 PS:问:...

    新人小试
  • 88-OOP之多重继承

    类的父类(基类)可以有很多个,子类可以调用所有父类的方法。 如果有重名方法,生效的顺序是自下而上,自左而右。当然最好不要出现重名方法。

    凯茜的老爸
  • python核心编程2 第五章 练习

    5-2 运算符 (a) 写一个函数,计算并返回两个数的乘积 (b) 写一段代码调用这个函数,并显示它的结果

    py3study
  • 【Python 第28课】 字符串的分割

    字符串和list之间有很多不得不说的事。比如有同学想要用python去自动抓取某个网页上的下载链接,那就需要对网页的代码进行处理。处理的过程中,免不了要在字符串...

    Crossin先生

扫码关注云+社区

领取腾讯云代金券