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中tkinter模块窗口操作(详解python tkinter教程-事件绑定)
- python基础编程函数参数(详解Python 函数如何重载?)
- python中return 类的实例(Python实现Event回调机制的方法)
- pythonjson格式化原理(详解pythonstr与json类型转换)
- python获取网络数据tcp(Python选择网卡发包及接收数据包)
- python udp网络编程(python实现一个简单的udp通信的示例代码)
- 正则表达式在python的中的应用(Python中正则表达式的用法总结)
- python把str转成list(python3 字符串/列表/元组str/list/tuple相互转换方法及join函数的使用)
- pythonpandas使用攻略(详解Python中pandas的安装操作说明傻瓜版)
- python人脸识别实战视频(Python学习笔记之图片人脸检测识别实例教程)
- vscode如何配置python环境(VSCode Python开发环境配置的详细步骤)
- python交互执行shell脚本(python 利用文件锁单例执行脚本的方法)
- python使用什么函数定义匿名函数(Python匿名函数及应用示例)
- 用python如何写tkinter(浅谈python3.6的tkinter运行问题)
- python人脸识别库(python3人脸识别的两种方法)
- python将txt数据写入excel(Python将列表数据写入文件txt, csv,excel)
- 一课译词 放鸽子(一课译词放鸽子)
- 终于来了,淘宝更改账户名测试中,快去看看你能不能修改(淘宝更改账户名测试中)
- 淘宝支持账号名修改,网友 终于可以 重新做人 了(淘宝支持账号名修改)
- 盘点那些年让人称奇的年终奖 最后一个赢辣条毫无悬念(盘点那些年让人称奇的年终奖)
- 你还没有升职吗 他竟因为几套激励理论,升职了(你还没有升职吗)
- 某知名企业绩效管理体系及薪酬分配体系操作手册(某知名企业绩效管理体系及薪酬分配体系操作手册)
热门推荐
- css3填充式进度条动画(CSS3样式linear-gradient的使用实例)
- html5中提供的绘图元素(使用Html5中的cavas画一面国旗)
- 哪些Web设计影响用户体验
- sqlserver表值函数用法(SQL Server数据库中的表名称、字段比较)
- vue走马灯特效(Javascript结合Vue实现对任意迷宫图片的自动寻路)
- 阿里云ecs升级配置注意事项(阿里云ECS挂载OSS的方法)
- windows安全策略设置sqlserver(SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7Administrator 的信)
- pythontkinter详解(python3.6使用tkinter实现弹跳小球游戏)
- python3的循环怎么用(对Python3 goto 语句的使用方法详解)
- mysql中修改表的字段名(MySQL 使用SQL语句修改表名的实现)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9