python怎么判断对象属性(判断python对象是否可调用的三种方式及其区别详解)
python怎么判断对象属性
判断python对象是否可调用的三种方式及其区别详解查找资料,基本上判断python对象是否为可调用的函数,有三种方法
使用内置的callable函数
|
callable (func) |
用于检查对象是否可调用,返回True也可能调用失败,但是返回False一定不可调用。
官方文档:https://docs.python.org/3/library/functions.html?highlight=callable#callable
判断对象类型是否是FunctionType
|
type (func) is FunctionType # 或者 isinstance (func, FunctionType) |
判断对象是否实现 __call__ 方法
|
hasattr (func, '__call__' ) |
写个小demo,测试下这三种验证方式的区别
|
from types import FunctionType __author__ = 'blackmatrix' class ClassA: @staticmethod def func_a(): pass @classmethod def func_b( cls , arg): pass def func_c( self , arg): pass def func_d(): pass if __name__ = = '__main__' : class_a = ClassA() print ( '静态方法,实例调用验证' ) print ( "callable(class_a.func_a) result: {result}" . format (result = callable (class_a.func_a))) print ( "type(class_a.func_a) is FunctionType result: {result}" . format (result = type (class_a.func_a) is FunctionType)) print ( "hasattr(class_a.func_a, '__call__') result: {result}" . format (result = hasattr (class_a.func_a, '__call__' ))) print ( '静态方法,类调用验证' ) print ( "callable(ClassA.func_a) result: {result}" . format (result = callable (ClassA.func_a))) print ( "type(ClassA.func_a) is FunctionType result: {result}" . format (result = type (ClassA.func_a) is FunctionType)) print ( "hasattr(ClassA.func_a, '__call__') result: {result}" . format (result = hasattr (ClassA.func_a, '__call__' ))) print ( '类方法验证' ) print ( "callable(ClassA.func_b) result: {result}" . format (result = callable (ClassA.func_b))) print ( "type(ClassA.func_b) is FunctionType result: {result}" . format (result = type (ClassA.func_b) is FunctionType)) print ( "hasattr(ClassA.func_b, '__call__') result: {result}" . format (result = hasattr (ClassA.func_b, '__call__' ))) print ( '实例方法验证' ) print ( "callable(class_a.func_c) result: {result}" . format (result = callable (class_a.func_c))) print ( "type(class_a.func_c) is FunctionType result: {result}" . format (result = type (class_a.func_c) is FunctionType)) print ( "hasattr(class_a.func_c, '__call__') result: {result}" . format (result = hasattr (class_a.func_c, '__call__' ))) print ( '函数验证' ) print ( "callable(func_d) result: {result}" . format (result = callable (func_d))) print ( "type(func_d) is FunctionType result: {result}" . format (result = type (func_d) is FunctionType)) print ( "hasattr(func_d, '__call__') result: {result}" . format (result = hasattr (func_d, '__call__' ))) |
通过运行结果,发现三种方法的验证结果并不相同。
主要是type(func) is FunctionType方法,在验证类方法和实例方法时,会返回False,
从调试的结果上看,实例方法,和类方法的类型都是<class 'method'>,不是FunctionType,所以会返回False
|
静态方法,实例调用验证 callable (class_a.func_a) result: True type (class_a.func_a) is FunctionType result: True hasattr (class_a.func_a, '__call__' ) result: True 静态方法,类调用验证 callable (ClassA.func_a) result: True type (ClassA.func_a) is FunctionType result: True hasattr (ClassA.func_a, '__call__' ) result: True 类方法验证 callable (ClassA.func_b) result: True type (ClassA.func_b) is FunctionType result: False hasattr (ClassA.func_b, '__call__' ) result: True 实例方法验证 callable (class_a.func_c) result: True type (class_a.func_c) is FunctionType result: False hasattr (class_a.func_c, '__call__' ) result: True 函数验证 callable (func_d) result: True type (func_d) is FunctionType result: True hasattr (func_d, '__call__' ) result: True |
因为Python中分为函数(function)和方法(method),函数是Python中一个可调用对象(用户定义的可调用对象,及lambda表达式创建的函数,都是函数,其类型都是FunctionType),方法是一种特殊的类函数。
官方文档中,对于method的定义:
Methods are always bound to an instance of a user-defined class
类方法和类进行绑定,实例方法与实例进行绑定,所以两者的类型都是method。
而静态方法,本身即不和类绑定,也不和实例绑定,不符合上述定义,所以其类型应该是function。
其中还有需要注意的是,如果一个类实现了__call__方法,那么其实例也会成为一个可调用对象,其类型为创建这个实例的类,而不是函数或方法。
|
class TheClass: def __call__( self , * args, * * kwargs): return self if __name__ = = '__main__' : the_class = TheClass() # True print ( 'class_instance callable {callable} ' . format ( callable = callable (the_class))) |
所以通过类型去判断Python对象是否可调用,需要同时判断是函数(FunctionType)还是方法(MethodType),或者类是否实现__call__方法。
如果只是单纯判断python对象是否可调用,用callable()方法会更稳妥。
以上这篇判断python对象是否可调用的三种方式及其区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。
原文链接:https://www.cnblogs.com/blackmatrix/p/6831048.html
- docker下运行python3(使用Docker+jenkins+python3环境搭建超详细教程)
- python处理excel基础教程第3讲(Python Excel处理库openpyxl使用详解)
- 浅谈Python3中strip()、lstrip()、rstrip()用法详解(浅谈Python3中strip、lstrip、rstrip用法详解)
- python数组与矩阵转换(python 读取文件并把矩阵转成numpy的两种方法)
- python列出文件夹下所有文件(python批量修改文件夹及其子文件夹下的文件内容)
- python做学生成绩系统(python学生管理系统)
- python中test函数用法(Python TestCase中的断言方法介绍)
- python多线程和多进程应用场景(Python多线程处理实例详解单进程/多进程)
- python中对象方法和顶级方法(Python3.5面向对象程序设计之类的继承和多态详解)
- python本地ocr库(详解Python安装tesserocr遇到的各种问题及解决办法)
- 用python3.5.3实现邮件收发(Python使用POP3和SMTP协议收发邮件的示例代码)
- python怎么导入函数pandas(python将pandas datarame保存为txt文件的实例)
- python定时任务详解(使用Python做定时任务及时了解互联网动态)
- python高德地图可视化(利用python和百度地图API实现数据地图标注的方法)
- python编写计算机病毒教程(Python告诉你木马程序的键盘记录原理)
- pythonnumpy定义一个2*2数组(对python numpy.array插入一行或一列的方法详解)
- 精英律师 廖佳敏封印恋情曝光,顾婕马失前蹄 你个老不死的(廖佳敏封印恋情曝光)
- 以家人之名广受好评,剧情生动引起观众共鸣,演员张新成圈粉无数(以家人之名广受好评)
- 三兄妹感情再遇波折,人设接连崩塌 《以家人之名》剧情猜不透(三兄妹感情再遇波折)
- 《小敏家》金波想要复婚 这只是他圈套的第1步,更可恶的在后面(小敏家金波想要复婚)
- 小敏家 剧情离谱一锅乱炖,但他们俩绝对是这部剧的一大 亮点(剧情离谱一锅乱炖)
- 《倚天屠龙记》再遭翻拍,关晓彤主演赵敏,蒋劲夫演张无忌,你怎么看(倚天屠龙记再遭翻拍)
热门推荐
- sql server 2008自定义函数(SQL SERVER 2012新增函数之逻辑函数CHOOSE详解)
- html5div例子(html5 外链式实现加减乘除的代码)
- 微信小程序映射设置(微信小程序虚拟列表的实现示例)
- websocket聊天室怎么设置(基于websocket实现简单聊天室对话)
- 虚拟主机和云服务区别(云主机与虚拟主机有什么不同?)
- python多线程多进程运行场景(Python多线程同步---文件读写控制方法)
- pyqttreeview控件使用详解(GTK treeview原理及使用方法解析)
- js原生tab栏切换(JavaScript实现简易tab栏切换案例)
- 少用iframe的原因
- python统计出现文字最多的词(使用Python 统计高频字数的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9