绑定调用和非绑定调用

在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. JS清除空格之trim()方法

    JQ: $.trim() 函数用于去除字符串两端的空白字符. 注意:$.trim()函数会移除字符串开始和末尾处的所有换行符,空格(包括连续的空格)和制表符.如果这些空白字符在字符串中间时,它们将被保 ...

  2. 关于sarima模型的描述,时间序列的理论与方法(第二版)(美 布洛克威尔)有一部分比较值得看

  3. 时间复杂度Big O以及Python 内置函数的时间复杂度

    声明:本文部分内容摘自 原文 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了Python中若干方法的时间复杂度(或者叫"大欧",&qu ...

  4. Plastic Sprayer Manufacturer - How Does The Sprayer Work?

    The Plastic Sprayers Manufacturer   stated that the sprayer is a very useful type of machine and a g ...

  5. ubuntu13.10安装tomcat

    步骤: ubuntu :13.10(32bit) -->i586 jdk 1.7 安装JDK 步骤: 1.官网下载如下图: 2.点击java SE7,下载jdk1.7 3.点击接受,并下载对应的 ...

  6. MySQL之多表查询(笛卡尔积查询、内连接、外连接(左外连接,右外连接)、union、union all )

    多表查询 测试数据 create table emp (id int,name char(10),sex char,dept_id int); insert emp values(1,"大黄 ...

  7. 访问HDFS文件系统

    一.命令行接口 默认操作的是hdfs hadoop dfsadmin -safemode leave/enter---离开或进入安全模式 hadoop fs -copyFromLocal    loc ...

  8. 使用restTemplate发送post请求,传入参数是在requestBody请求体中,以json形式传输

    @PostMapping public ResponseResult add(User user){ HttpHeaders httpHeaders = new HttpHeaders(); Medi ...

  9. go笔记(go中的方法调用)

    最近接触go语言  发现和java的方法调用有些类似但又有自己的注意点 go的包我理解为则是隔离的最小模块 先在src目录下创建main.go文件  package为main,然后在src下创建mod ...

  10. Educational Codeforces Round 73 (Rated for Div. 2)E(思维,博弈)

    //这道题博弈的核心就是不能让后手有一段只能放b而长度不够放a的段,并且先手要放最后一次#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h> ...