绑定调用和非绑定调用

在python中,绑定调用和非绑定调用其实是相对于实例来说的。抽象点说就是:在类实例化过程中,类的方法会绑定在实例之中,此时,这个实例会拥有这个类的具体属性和方法,这些属性和方法已经和这个实例合为一体,就算类消失了或者改变了,也不会影响到实例。看例子很容易知道:

In [1]: class A(object):
...: def sayhello(self):
...: print("hello")
...: In [2]: a = A() In [3]: a.sayhello()
hello

接着上面的代码,我们对类A进行修改,将类A的sayhello()方法删除:

In [5]: class A(object):
...: pass
...: In [6]: a.sayhello()
hello

看,实例a还能正常使用方法sayhello。所谓绑定,就是将类中的方法绑定到实例中。

知道了绑定调用时什么,非绑定调用就呼之欲出了:

调用没有绑定到具体实例中的方法就是非绑定调用。当类改变时,方法也随之消失,调用不了。看例子:

In [9]: class A(object):
...: def Hello(self):
...: print("Hello, nice to meet you...")
...: In [10]: A.Hello(A())
Hello, nice to meet you... In [11]: class A(object):
...: pass
...: In [12]: A.Hello(A())
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-12-ad9a8d78a351> in <module>()
----> 1 A.Hello(A()) AttributeError: type object 'A' has no attribute 'Hello'

代码很直白了。这里的疑问是,为什么在进行非绑定调用时要传经参数A()?其实,这又涉及到python中的method种类。我们看到,在类A中定义def Hello(self)中的self参数,这就意味这这是一个实例方法(instancemethod)。self是一个实例参数,要传递一个实例进去,所以我们将实例A()传进去。

而关于python中的各种method区别,看这里

我们换一种方式来定义类方法就会更直白:

In [13]: class A(object):
...: def Hello():
...: print("Hell0, nice to meet you...")
...: In [14]: A.Hello()
Hell0, nice to meet you... In [15]: class A(object):
...: pass
...: In [16]: A.Hello()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-16-d3af5ce93a22> in <module>()
----> 1 A.Hello() AttributeError: type object 'A' has no attribute 'Hello'

结论

同一个方法,在不同情况下,可以被绑定调用非绑定调用


版权:保留所有权,转载请注明出处!


python绑定调用和非绑定调用的更多相关文章

  1. Day7 子类调用父类的方法supper 绑定方法与非绑定方法

    supper:可以利用supper来重用父类的方法,可以不用指名道姓的调用了. class OldboyPeople: school = 'oldboy' def __init__(self,name ...

  2. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  3. 全面解析python类的绑定方法与非绑定方法

    类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...

  4. Python开发基础-Day21多态与多态性、绑定方法和非绑定方法

    多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...

  5. python基础之多态与多态性、绑定方法和非绑定方法

    多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...

  6. Python面向对象之封装、property特性、绑定方法与非绑定方法

    一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...

  7. Day 5-5 绑定方法与非绑定方法

    绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...

  8. Learning-Python【25】:绑定方法与非绑定方法

    类中定义函数分为了两大类,绑定方法与非绑定方法,它们有一些特殊之处: 1.绑定方法特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法:这个在面向对象第一篇第六 ...

  9. 类的封装,property特性,类与对象的绑定方法和非绑定方法,

    类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...

随机推荐

  1. Robot Framework 使用【1】-- 基于Python3.7 + RIDE 最新版本搭建

    前言 Robot Framework作为公司能快速落地实现UI自动化测试的一款框架,同时也非常适合刚入门自动化测试的朋友们去快速学习自动化,笔者计划通过从搭建逐步到完成自动化测试的过程来整体描述它的使 ...

  2. [02]Sort选择排序

    选择排序 算法速度:通过大O表示法表示,O(n),n是操作数,表示算法执行的次数: 数组:是有序的元素序列:若将有限个类型相同的变量的集合命名,那么这个名称为数组名: 链表:是一种物理存储单元上非连续 ...

  3. iOS 开发之 生产者与消费者模式及其实现

    概念: 在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理数据的 ...

  4. Windows 安装python虚拟环境

    windows 安装pytho虚拟环境 方法一:virtualenv (1)使用pip安装virtualenv工具 pip install virtualenv (2)使用virtualenv创建虚拟 ...

  5. cross_val_score 交叉验证与 K折交叉验证,嗯都是抄来的,自己作个参考

    因为sklearn cross_val_score 交叉验证,这个函数没有洗牌功能,添加K 折交叉验证,可以用来选择模型,也可以用来选择特征 sklearn.model_selection.cross ...

  6. Python Tkinter学习笔记

    介绍 入门实例 显示一个窗口,窗口里面有一个标签,显示文字 import tkinter as tk # 一个顶层窗口的实例(Top Level),也称为根窗口 app = tk.Tk() # 设置窗 ...

  7. windows下 DEV-C++无法连接到pthread.h的解决办法

    参考的这个博文,原博文有图片:http://lslin.iteye.com/blog/776325 (我只是为了方便写.copy一遍) dev-C++编写C/C++程序时,非常方便轻巧,但是今天学习多 ...

  8. GitHub 网站汉化

    居然是一个中文Github网站!该不会是个假的吧? 2018-09-03 17:30 前几天分享了一篇文章——3个搜索技巧!在 GitHub上快速找到实用资源!眼尖心细的读者发现了文中的Github网 ...

  9. in comment after two dashes (--) next character must be > not - (position: START_TAG seen ...

    Error executing Maven. in comment after two dashes (--) next character must be > not - (position: ...

  10. R语言 which() 、 which.min() 、 which.max() 函数

    函数 which() 可以用来找到满足条件的下标,如 x <- c(3, 4, 3, 5, 7, 5, 9) which(x > 5) 5 7 seq(along=x)[x > 5] ...