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

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

最后,任何一个方法定义的第一个参数都是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. linux 查看 cpu

    如何获得CPU的详细信息: linux命令:cat /proc/cpuinfo 用命令判断几个物理CPU,几个核等: 逻辑CPU个数:# cat /proc/cpuinfo | grep " ...

  2. 【BZOJ1939】[Croatian2010] Zuma(动态规划)

    题目: BZOJ1939(权限题) 分析: 这题很容易看出是DP,但是状态和转移都不是很好想-- 用\(dp[l][r][c]\)表示在\(l\)前面已经新加了\(c\)个和\(l\)一样的弹子时,使 ...

  3. Ubuntu16安装jdk8配置Tomcat9

    一.配置jdk 1.下载解压是肯定不能少的 2.配置环境变量根据自己需求来 export JAVA_HOME=/usr/software/jdk1.8.0_121 export CLASSPATH=. ...

  4. UVM基础之----uvm_object

    uvm_void The uvm_void class is the base class for all UVM classes. uvm_object: The uvm_object class ...

  5. JS——html基本结构

    document.title——文档标题 document.head——文档头标签 document.body——文档的主体 document.documentElement 表示整个文档的html标 ...

  6. 使用FastReport的BarCode2D控件生成含中文的PDF417条形码

    解决方法:设定CodePage为936 FastReport用户手册中关于CodePage的说明: CodePage This property is specific to the PDF417 a ...

  7. Nagios事件机制实践

    Nagios事件机制实践  blog地址:http://www.cnblogs.com/caoguo 一.事件触发执行脚本 [root@Nagios ~]# cd /usr/local/nagios/ ...

  8. PHP 之websocket实现聊天室功能

    一.功能界面 具体的详细代码:https://github.com/yangsphp/websocket-master/tree/master 二.具体代码实现 1.前端代码如下 <!DOCTY ...

  9. jinkins配置python虚拟环境

    cd /root/.virtualenvs . automationVenv/bin/activate cd /home/wangju/gitProject/automationtest#cd pyt ...

  10. Django - 数据获取

    Django - 数据获取 1.radio值获取 2.checkbox获取 3.select 获取 select 获取值,需要根据前端multiple来获取,get or getlist; 4.上传文 ...