python 可调用对象之类实例
可调用对象,即任何可以通过函数操作符()来调用的对象。
python可调用对象大致可以分为4类:
1、函数
python中有三种函数:内建函数(BIFs)、用户自定义函数(UDF)、lambda表达式
2、方法
和函数类似,方法也有內建方法(BIM)和用户自定义方法(UDM)。用户自定义方法是被定义为类的一部分的函数;內建方法,如一个python数据类型如列表和字典,也有方法,这些方法就叫做内建方法。
內建方法和内建函数不同之处在于,內建方法的__self__属性指向一个python对象,而内建函数的__self__指向None
3、类
实例化
4、某些类的实例
python给类创建了__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__()是没有实现的,即大多数的类的实例是不可调用的。而如果类中实现了这个方法,那么这个类的实例就成了可调用的了。
调用这样的实例等同于调用__call__()方法。
这里主要讲一下可调用实例的作用:
1、可以简化对象下方法的调用
如foo 类实现了__call__()方法,那么调用 foo() 和调用foo.__call__()是一样的。
这种使用与当对象下面只有一个方法的时候,或者对象下某个方法被使用很多次的情况下。
2、模糊了对象和函数的区别,这个具体有什么用呢?看个例子:
class A():
def get():
return object()
class B():
def run():
return object()
def foo():
return object()
上面创建了两个类和一个函数,现在我需要定义main函数,接收一个参数,并得到object对象
def Main(param):
# 如果param为A
param.get()
# 如果param为B
param.run()
# 如果param为foo
param()
Main(A())
Main(B())
Main(foo)
要完成这个需求,通过上面三种方式去分别调用,且需要在main函数内部去判断,当前调用的是哪个类
那么如果我把上面的三种情况换成可调用对象实例的方式去完成呢?
class A():
def __call__():
return object()
class B():
def __call__():
return object()
def foo():
return object()
这样改写后,同样要实现上面的需求,我们需要怎么做呢?
def Main(callableFun):
callableFun()
Main(A())
Main(B())
Main(foo)
可以看到,在main函数内部,我们可以大大的简化我们的代码,不需要再针对的性的去做判断,这就是可调用实例类的用处之一。
python 可调用对象之类实例的更多相关文章
- python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法
1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过“类名()”的方式实例 ...
- python之 类对象 类方法 实例对象 实例方法 静态方法
实例对象1. 创建的时间:使用 类名()的时候,就创建一个实例对象2. 实例属性:怎样添加 只要是一个变量能够指向这个实例对象,那么这个变量.xxxx = 111就是给其添加一个实例属性 特点: 跟着 ...
- Python 可调用对象
除了用户定义的函数,调用运算符(即 ())还可以应用到其他对象上.如果想判断对象能否调用,可以使用内置的 callable() 函数.Python 数据模型文档列出了 7 种可调用对象.(1)用户定义 ...
- python面向对象编程对象和实例的理解
给你一个眼神,自己体会
- Python深入03 对象的属性
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python一切皆对象(object),每个对象都可能有多个属性(attribut ...
- Python类与对象的理解
注意python的类对象与实例对象的区分 类对象与实例对象是相对的,例如:a=1,那么a就是int的一个实例对象,这里的a相对于int来说,a是实例对象,int是类对象.但是int同时又是type的实 ...
- python—类对象和实例对象的区别
最近在对RF的通讯层的模块进行封装,需要将之前放在类似main里面的一个方法,如下所示:这段代码是开发提供,用于接口测试,模拟底层通讯,具体的通讯是在dll内,python这边只是做了个封装让RF进行 ...
- Python中的7种可调用对象
Python中有七种可调用对象,可调用对象可使用内置函数callable来检测 一.用户自定义的函数: 使用def语句或者lambda表达式创建的函数. 二.内置函数: 使用C语言实现的函数,如len ...
- python之对象(实例)
1.对象是关于类而实际存在的一个例子,即实例 #类实例化得到g1这个实例 class Garen: camp='Demacia' def __init__(self,nickname,aggressi ...
随机推荐
- 使用VSTS的Git进行版本控制(四)——在Visual Studio中管理分支
使用VSTS的Git进行版本控制(四)--在Visual Studio中管理分支 可以从web版Team Services Git repo 的Branches视图中管理工作.定制视图来跟踪最关注的分 ...
- ELK环境配置+log4j日志记录
ELK环境配置+log4j日志记录 1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一 ...
- jQuery设置元素的readonly和disabled属性
jQuery的api中提供了对元素应用disabled和readonly属性的方法,如下: 1.readonly $('input').attr("readonly",&qu ...
- Python中函数partial的应用
函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下, 一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用.通过设定参数的默认值,可以降 ...
- 使用epoll实现聊天室功能,同时比较epoll和select的异同
1.首先介绍一下select和epoll的异同,如下(摘抄自https://www.cnblogs.com/Anker/p/3265058.html) select的几大缺点: (1)每次调用sele ...
- iOS弹出UIViewController小视图
在TestViewController1中弹出TestViewController2 在TestViewController中点击按钮或者什么触发方法里面写入以下代码 TestViewControll ...
- leetcode刷题--两数之和(简单)
一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...
- Gulp的简单使用
我比较喜欢使用Gulp,因为简单好用! 今天的任务是:使用Gulp来压缩 jQuery源码,各输出一个压缩的和未压缩的版本 第一步:安装 cnpm install gulp --save-dev cn ...
- ASP.NET API Helper Page 创建并生成相关帮助文档
创建API项目 修改原工程文件,该行为是为了避免和引入第三方API工程文件冲突 修改发布设置 引入需要生成文档的相关文件,将第三方API依赖的相关文件(XML文件非常重要,是注释显示的关键),复制到文 ...
- [HAOI2018]苹果树
嘟嘟嘟 这种计数大题就留给南方的计数神仙们做吧-- 刚开始我一直想枚举点,考虑新加一个点在根节点的左右子树,以及左右子树大小怎么分配,但是这样太难计算新的点带来的贡献了. 后来lba又提示我枚举边,考 ...