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
- python 二维数组怎么取第二列(python实现二维数组的对角线遍历)
- python为什么要用多进程(对Python的多进程锁的使用方法详解)
- opencv轮廓模糊识别(Opencv+Python实现图像运动模糊和高斯模糊的示例)
- python数值基本运算方法(Python常见数字运算操作实例小结)
- python时间类的实现(Python日期时间Time模块实例详解)
- python线程池如何实现同步(Python mutiprocessing多线程池pool操作示例)
- python语言翻译中文(浅析Python 实现一个自动化翻译和替换的工具)
- python中if语句应学会什么(Python基础之条件控制操作示例if语句)
- python 取出时间段日志(python 实现提取某个索引中某个时间段的数据方法)
- python3函数的使用方法(Python3.5基础之函数的定义与使用实例详解参数、作用域、递归、重载等)
- python读写文件实验心得(Python文件读写常见用法总结)
- python爬网验证码在哪里(详解python 爬取12306验证码)
- python 读文件报错处理(解决python写入带有中文的字符到文件错误的问题)
- python类的init方法(Python操作配置文件ini的三种方法讲解)
- python使用门算法加密文件(python实现可逆简单的加密算法)
- python测试websocket接口(Python如何爬取实时变化的WebSocket数据的方法)
- 泰国旅游攻略(泰国旅游攻略必去景点)
- 越难春卷(越难春卷皮怎么用)
- 休闲VS新古典 办公家居简约设计(办公家居简约设计)
- 15个新成 园 位置公布 深圳龙岗2022年共建花园建设又有大动作(15个新成园位置公布)
- 记者手记 书记带我去 巡街(记者手记书记带我去)
- 富士胶片集团将向土耳其东南部地震灾民捐赠5000万日元 | 美通社(富士胶片集团将向土耳其东南部地震灾民捐赠5000万日元)
热门推荐
- laravel命令行与可选项(Laravel6.0.4中将添加计划任务事件的方法步骤)
- pythondjango图解(详解Django-restframework 之频率源码分析)
- 面向对象的装封、继承、多态的概念理解
- python线程自动停止了(解决Python中定时任务线程无法自动退出的问题)
- docker容器启动原理(docker容器的原理分析)
- 如何让API接口更安全
- python实现的数据结构(Python嵌套式数据结构实例浅析)
- vue慢动作怎么操作(vue开发之moment的介绍与使用)
- python外部如何调嵌套函数(python中嵌套函数的实操步骤)
- sleep线程不安全(当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长的原因及解决办法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9