首先,方法是类内部定义的函数,所以方法是类的属性而不是实例的属性。

其次,方法只能在所属的类拥有实例的时候才能被调用。当存在一个实例的时候,我们可以说方法被绑定到实例。如果没有实例,那么我们就说方法是未绑定的。

最后,任何一个方法定义的第一个参数都是self。self是调用此方法的实例。

再强调一下绑定与未绑定。不管绑定与否。方法的代码都是一样的,区别只是是否存在一个实例来调用这个方法。

ok。我们用例子来理解一下上面的话。首先是第一句。

>>> class A:
... def foo(self):
... print 'foo running'
...
>>>
>>> a=A()
>>> a.attr1=1
>>> a.attr2=2
>>>
>>> a.__dict__
{'attr2': 2, 'attr1': 1}
>>> A.__dict__
{'__module__': '__main__', 'foo': <function foo at 0x7f4456f5bb90>, '__doc__': None}

我们创建一个类A,其有一个函数foo。 我们实例化类A并赋给变量a。 然后看变量a的属性有 attr1,attr2。但是并没有foo函数。 而A的属性里面有函数foo。所以符合第一句话,foo是类的属性不是实例的属性。

其次是第二句,只有类在拥有实例的时候才可以调用方法。否则是未绑定的。

>>> A.foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with A instance as first argument (got nothing instead)
>>> A().foo()
foo running
>>>

看到A直接调用foo出错。 但是实例化后就可以调用。 不过我们再看一个例子。这就是一个未绑定调用的例子。

>>> class addrEntry:
... def __init__(self,nm,ph):
... self.name=nm
... self.phone=ph
...
>>> class EmpAddrEntry(addrEntry):
... def __init__(self,nm,ph,email):
... addrEntry.__init__(self,nm,ph)
... self.email=email
...

这个例子中,EmpAddrEntry以addrEntry为base class。在定义自己的 __init__的时候调用了父类的__init__但是这时候父类还没有 实例,所以这就是一个未绑定调用。 未绑定调用会出错是因为函数一般要求一个类的实例作为第一个参数。如果没有就会出错。这里是把子类的实例传递进来,所以没有报错。 不过调用仍然是用类直接调用的。所以是未绑定调用。 下面又是一个例子,虽然是未绑定调用,但是仍然会执行。

>>> class A:
... def foo(self):
... print 'foo running'
...
>>> a=A()
>>> a.foo()
foo running
>>>
>>> A.foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with A instance as first argument (got nothing instead)
>>> A.foo(a)
foo running

最后, 第三句就不用解释了吧。 不过也有函数的第一个方法不是 self。 比如 __new__ 。这是因为 __new__ 是python 新类中的特性。 python 在2.2版本的时候对类做了调整。上面的内容是旧式类的特性。 新式类中有下面两个概念。 静态方法和类方法。 下面我们了解一下这两个概念:

首先我们看一下创建静态方法和类方法的例子:

>>> class TestStaticMethod:
... def foo():
... print 'calling static method foo()'
... foo = staticmethod(foo)
...
>>> class TestClassMethod:
... def foo(cls):
... print 'calling class method foo()'
... print 'foo() is part of class:', cls.__name__
... foo = classmethod(foo)
...

注意这里面用到了两个内建函数 staticmethod() 和 classmethod()。 这两个函数会把对应的方法转化成静态函数和类函数。 否则的话,你在调用的时候,系统会认为他们是普通的方法,会报没有self的错误。

python 类中的方法的更多相关文章

  1. 031.Python类中的方法

    一 类中的方法 1.1 介绍 (1) 普通方法(2) 绑定方法 绑定到对象 (自动传递对象参数) 绑定到类 (自动传递类参数) (3) 静态方法 (无论类还是对象,都可以调用) class Plane ...

  2. Python 类中__init__()方法中的形参与如何修改类中属性的值

    一.__init__()方法 如果__init__()方法为 class Cat(): def __init__(self,num) : self.num=num Python中类的__init__( ...

  3. Python 简明教程 --- 20,Python 类中的属性与方法

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...

  4. Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  5. 如何访问python类中的私有方法

    在python中,不像c#/java类语言,支持类的私有方法,这点有点像objc,虽然objc可以通过扩展extension来实现,但源于objc的运行时特性,我们还是可以通过非常手段来进行访问的.不 ...

  6. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  7. python 类中方法总结 --- 实例方法、类方法、静态方法

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...

  8. 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑

    上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...

  9. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

随机推荐

  1. Gson 转日期中的错误

    今天在用Gson做json转化是遇到一个问题,本地执行没有问题(windows 7),包丢到服务器上(Centos)就报错了. 后经分析发现DateTypeDapter类中取本地环境的日期格式参考ht ...

  2. Leetcode0133--Clone Graph 克隆无向图

    [转载请注明]:https://www.cnblogs.com/igoslly/p/9699791.html 一.题目 二.题目分析 给出一个无向图,其中保证每点之间均有连接,给出原图中的一个点 no ...

  3. webstorm中配置过visualsvn,后面做更改要更换authentication realm的解决办法

    找这个找了好久,一直改不过来,终于找到了解决办法 首先,在提交代码时提示: 但是我的authentication realm已经时这个了,并且账号和密码也改了,所以要更改authentication ...

  4. html5——多列布局

    基本概念 1.多列布局类似报纸或杂志中的排版方式,上要用以控制大篇幅文本. 2.跨列属性可以控制横跨列的数量 /*列数*/ -webkit-column-count: ; /*分割线*/ -webki ...

  5. JS——鼠标跟随

    注意事项: 1.pageX.pageY的兼容问题 2.使目标移动鼠标中间位置还必须减去盒子宽度的一半 <!DOCTYPE html> <html lang="en" ...

  6. 转载:使用FileReader对象的readAsDataURL方法来读取图像文件

    文章转载自:http://blog.okbase.net/jquery2000/archive/1296.html: FileReader对象的readAsDataURL方法可以将读取到的文件编码成D ...

  7. asp.net MVC 下拉多级联动及编辑

    多级联动实现,附源码.当前,部分代码是参与博客园其它网友. 新增,前台代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...

  8. 【译】x86程序员手册21-6.3.5为操作系统保留的指令

    6.3.5 Some Instructions are Reserved for Operating System 为操作系统保留的一些指令 Instructions that have the po ...

  9. Python语言之模块

    模块基本上就是一个包含了所有你定义的函数和变量的文件.它用处在于使你你能在别的程序中重用它提供的功能和服务. 1.模块的使用方法 模块的文件名必须以.py作为扩展名. 当我们需要使用某个模块时,我们需 ...

  10. 使用TFS創建團隊項目

    使用微軟賬號登錄Team Service,關聯一個TS賬戶,用來存放你所有的項目,可以從瀏覽器中直接訪問,地址類似yourname.visualstudio.com. 詳細鏈接 在TS賬戶主面板中,可 ...