python 类中的方法
首先,方法是类内部定义的函数,所以方法是类的属性而不是实例的属性。
其次,方法只能在所属的类拥有实例的时候才能被调用。当存在一个实例的时候,我们可以说方法被绑定到实例。如果没有实例,那么我们就说方法是未绑定的。
最后,任何一个方法定义的第一个参数都是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 类中的方法的更多相关文章
- 031.Python类中的方法
一 类中的方法 1.1 介绍 (1) 普通方法(2) 绑定方法 绑定到对象 (自动传递对象参数) 绑定到类 (自动传递类参数) (3) 静态方法 (无论类还是对象,都可以调用) class Plane ...
- Python 类中__init__()方法中的形参与如何修改类中属性的值
一.__init__()方法 如果__init__()方法为 class Cat(): def __init__(self,num) : self.num=num Python中类的__init__( ...
- Python 简明教程 --- 20,Python 类中的属性与方法
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...
- Python 装饰器装饰类中的方法
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- 如何访问python类中的私有方法
在python中,不像c#/java类语言,支持类的私有方法,这点有点像objc,虽然objc可以通过扩展extension来实现,但源于objc的运行时特性,我们还是可以通过非常手段来进行访问的.不 ...
- 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘
孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...
- python 类中方法总结 --- 实例方法、类方法、静态方法
在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...
- 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑
上节<第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解>通过案例详细分析了两个方法的执行顺序,不知大家是否注意到了,在上述 ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
随机推荐
- [Swift通天遁地]二、表格表单-(5)实现表格下拉和上拉刷新效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 聊聊 webpack 打包如何压缩包文件大小
想必很多人都经历过做完一个项目后,再打包发现某些文件非常大,导致页面加载时很慢,这就很影响用户体验了,所以在我经历了一些打包后,讲讲如何有效地缩小包体积,加快页面的首屏渲染 动态 polyfill 相 ...
- 03-vue实例生命周期和vue-resource
vue实例的生命周期 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子:就是生命周期事件的别名而已: 生命周期钩子 = 生命周期函 ...
- JavaScript正则表达式(一)-常用方法
公司之前有个胖女孩说你竟然会正则? 其实正则没那么难:今天我们说说他常用的几个API. 在讲方法之前, 我们先对正则表达式做一个基本的了解: 1.正则表达式定义使用单个字符串来描述.匹配一系列符合某个 ...
- JavaScript--输出内容(document.write)
document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用“”括起,直接输出""号内的内容. <scrip ...
- matlab中增加Java VM 的堆空间(解决xml_io_tools出现的OutOfMemory问题)
今天用MATLAB写程序,调用了xml_io_tools(很赞的一个xml读写工具包)中的函数,但是由于我要书写的文件比较大,5m左右,运行时不知道xml_io_tools中的哪一块超出了java中的 ...
- android sqlite中判断某个表是否存在
<span style="font-size:18px;">sqlite 中判断某个表是否存在的方法,贴出来供大家参考 /** * 判断某张表是否存在 * @param ...
- vue-cli的创建、基本配置和遇到的问题总结
vue-cli的创建及基本配置 1. 创建 vue-cli 项目 确保本地安装了最新版本的nodejs环境(会自带npm环境); 全局安装vue-cli,命令:npm i -g vue-cli 创建项 ...
- RabbitMQ 创建用户和创建Virtual host
https://www.bilibili.com/video/av18997807/?p=3 Virtual host 就是类似数据库吧.
- JS——高级各行换色
1.获取tbody下的子元素 2.注册鼠标覆盖事件时存储当时的背景颜色,注册鼠标离开事件时把存储的颜色赋值注册事件对象 <!DOCTYPE html> <html> <h ...