Python中类的方法有两种形式:

1、绑定方法和非绑定方法

绑定的概念主要与方法调用相关联,方法是类内部定义的函数(这意味着方法是类属性而不是实例属性),方法只有在其所属的类拥有实例时,才能被调用,当存在一个实例时,方法才被认为是绑定到那个实例了。任何一个方法定义中的第一个参数都是self变量,表示调用此方法的实例对象。

class Person():def __init__(self,name,age):self.name = nameself.age  = agedef talk(self):print "talk calling"p = Person('rhx',25)
print p.talk
<bound method Person.talk of <__main__.Person instance at 0x027A4DF0>>

注意这里不是调用的p.talk(),对于另一种情况,定义的talk()函数中没有self变量

class Person():def __init__(self,name,age):self.name = nameself.age  = agedef talk():print "talk calling"p = Person('rhx',25)
print p.talk
<bound method Person.talk of <__main__.Person instance at 0x02814DF0>>

发现无论talk中是否带有self,实例化对象 p 均可以调用。这也说明了不管是类中的方法,还是类中定义的函数,默认情况下都是绑定给对象使用的,在实例中调用一个绑定的方法时,不需要手动的传入参数了。

class Person():def __init__(self,name,age):self.name = nameself.age  = agedef talk():print "talk calling"p = Person('rhx',25)
print Person.talk
print p.talk
<unbound method Person.talk>  #使用类名进行调用,为非绑定的方法
<bound method Person.talk of <__main__.Person instance at 0x02794DF0>>  #使用实例化对象进行调用为绑定的方法

对于在talk中带有self变量的情形

class Person():def __init__(self,name,age):self.name = nameself.age  = agedef talk(self):print "talk calling"p = Person('rhx',25)
print Person.talk()
print p.talk()
TypeError: unbound method talk() must be called with Person instance as first argument (got nothing instead)

结果表明talk()调用时必须传入类的实例化对象,当类调用类中的方法时候,是不会进行自动传值的,也就是说,函数有几个参数,就得传递进去几个参数。如果想结果正常运行,那么在类名调用talk()的时候,将参数一一都传递进去。即:

print Person.talk(p)
class Person():def __init__(self,name,age):self.name = nameself.age  = agedef talk():print "talk calling"p = Person('rhx',25)
print Person.talk
print p.talk()
    print p.talk()
TypeError: talk() takes no arguments (1 given)

从输出结果来看,Person来调用talk()方法时候,并不需要传递参数;而当对象来调用talk()的时候,由于对象调用自己的绑定方法,会自动将实例化对象当作第一个参数传递进去,所以,当类中talk()方法没有带参数时,而你又给它传递了一个,显然是会报错的。

  综上所述,我们可以得出以下结论: 

    1.凡是类中的方法和函数,都是绑定给对象使用的;

    2.绑定方法都有自动传值的功能。传递进去的值,就是对象本身。

    3.如果类想调用绑定方法,就必须遵循函数的参数规则,有几个参数,就必须传递几个参数。

既然类中的方法都是绑定给对象使用的,那么有没有方法是绑定给类使用的呢?

2、静态方法和类方法

既然类中的方法,默认都是绑定给对象使用,那么,我们要采取一点措施,将类中的绑定方法解除对象绑定关系,进而绑定到类上,通常的方法需要一个实例self作为第一个参数,并且对于(绑定的)方法调用来说,self时自动传递给这个方法的,而对于类方法而言,需要类而不是实例作为第一个参数,它是由解释器传给方法。在python中,引入了@classmethod方法,将类中的方法绑定到类身上。

class Person():def __init__(self,name,age):self.name = nameself.age  = age@classmethod               #talk = classmethod(talk)def talk(cls):             #cls即为类自身print "talk calling"p = Person('rhx',25)
print Person.talk()
print p.talk()

这里之所以实例化对象调用类方法也可行的原因就是类方法也有一个参数cls,实例化对象调用的时候将实例化对象self传递给形参cls。类中方法默认都是绑定给对象使用,当对象调用绑定方法时,会自动将对象作为第一个参数传递进去;而类来调用,则必须遵循函数参数一一对应的规则,有几个参数,就必须传递几个参数。如果一个方法是用了@classmethod装饰器,那么這个方法绑定到类身上,不管是对象来调用还是类调用,都会将类作为第一个参数传递进去。

在前面的例子中,对于没有参数的talk,使用类调用的时候是

class Person():def __init__(self,name,age):self.name = nameself.age  = agedef talk():print "talk calling"p = Person('rhx',25)
print Person.talk()
print p.talk()
    print Person.talk()
TypeError: unbound method talk() must be called with Person instance as first argument (got nothing instead)

但是传递一个实例化对象p的时候

print Person.talk(p)

仍然会有问题,因为方法talk本来就没有参数

   print Person.talk(p)
TypeError: talk() takes no arguments (1 given)

这个时候需要静态方法

class Person():def __init__(self,name,age):self.name = nameself.age  = age@staticmethod         #talk = staticmethod(talk)def talk():           #不能传递类或实例相关参数,如cls或者self,但是可以传递其它参数print "talk calling"p = Person('rhx',25)
print Person.talk()
print p.talk()

Python之方法调用相关推荐

  1. python中方法调用方法_Python中实现结构相似的函数调用方法

    python的dict用起来很方便,可以自定义key值,并通过下标访问,示例如下: >>> d = {'key1':'value1', ... 'key2':'value2', .. ...

  2. python方法调用名字不一样_python中调用父类同名方法

    知识回顾: 上节我们学习了类的构造方法. Python中构建构造方法主要使用__init__魔法方法. 实际项目操作中,由于类的继承导致可能覆盖同名的构造方法,导致只能使用子类的构造,而无法调用父类的 ...

  3. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  4. python方法调用方法_Python之方法调用

    Python中类的方法有两种形式: 1.绑定方法和非绑定方法 绑定的概念主要与方法调用相关联,方法是类内部定义的函数(这意味着方法是类属性而不是实例属性),方法只有在其所属的类拥有实例时,才能被调用, ...

  5. python调用oracle存,Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法.分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL. 首先,在数据库端 ...

  6. 奇怪,有的Python函数或方法调用需要两对括号?

    本文源自于一位读者的问题:为啥有的函数或方法调用要使用两对括号呢? 但是在我的印象里并没有这种用法啊.于是我简单扫了一眼代码,发现这位朋友说的并不是函数调用需要两对括号,而是使用元组做函数或方法的参数 ...

  7. java调用python脚本_调用Python写vb的脚本方法

    某个项目中涉及到这样一个情景: VB写的原始项目要调用Python的一些方法完成特殊的操作, 那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法. 具体步骤流程如下所示: ...

  8. python tkinter库 pack布局方法调用

    python的tkinter库pack布局方法调用 这个布局简单 tkinter.Label(window,text='今晚去庆祝',bg="back",fg='white').p ...

  9. python中如何调用类_python中如何调用类的方法

    类的方法的调用: 与普通的函数调用类似 1.类的内部调用:self.<方法名>(参数列表). 2.在类的外部调用:<实例名>.<方法名>(参数列表). 注意:以上两 ...

最新文章

  1. We wear culture:Google 艺术与文化项目带你探秘穿在身上的文化
  2. mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...
  3. win7下 apache2.2 +php5.4 环境搭建
  4. Virtualbox中win7虚拟机中U盘不可用问题的解决
  5. 【飞秋】基于Html5的Canvas实现的Clocks (钟表)
  6. JSF 源代码赏析之Lifecycle
  7. 为什么工厂招人越来越不容易?是招工难还是待遇低?
  8. ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客...
  9. 打造机器人:为遥控小车加一个树莓派
  10. EXCEL 利用替换、分列、填充功能综合整理财务数据
  11. Builder模式创建实体类
  12. 云端虚拟化技术的应用
  13. echarts-横坐标文字竖着显示和倾斜45度显示
  14. strut-控制器ActionServlet类详解
  15. Linux文件内容查阅 - cat, tac, nl, more, less, head, tail, od
  16. 2190: 【USACO】Farmer John has no Large Brown Cow
  17. java 时间轮算法_时间轮算法解析(Netty HashedWheelTimer源码解读)
  18. Golang基础教程——字符串常用方法总结
  19. 深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
  20. LeetCode 658、找到 K 个最接近的元素

热门文章

  1. iOS编程中throttle那些事
  2. android开发 权限大全
  3. 30个图片浏览插件收集
  4. ASP.NET 3.5核心编程学习笔记(18):数据绑定表达式
  5. VC开发多语言界面支持的简单方法
  6. mcp2515 芯片驱动总线错误BUG的解决方法(主要无法进入中断bug)
  7. 视频驱动V4L2子系统驱动架构 - ioctl
  8. python绘图—— matplotlib
  9. 手机突然电量消耗很快_手机突然出现这些故障!我来教你快速解决!
  10. Syntax error, annotations are only available if source level is 1.5 or greater.