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通天遁地]二、表格表单-(7)电子邮件Mail:实现单元格左右滑动调出功能按钮
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- distpicker三级联动,动态改变省市信息
一.引入3个js文件 <script type="text/javascript" src="js/distpicker.data.js">< ...
- Sql批量插入方法
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- PHP网站 通过js方式判断是否是手机访问,若是 跳转到手机版网址!
<script type="text/javascript" src="http://i3.dukuai.com/ui/js/jquery-1.32pack.js& ...
- 【LeetCode】-- 73. Set Matrix Zeroes
问题描述:将二维数组中值为0的元素,所在行或者列全set为0:https://leetcode.com/problems/set-matrix-zeroes/ 问题分析:题中要求用 constant ...
- Elasticsearch之sense插件安装之后的浏览详解
前提博客是 Elasticsearch之sense插件的安装(图文详解) 立马,可以看到 http://192.168.80.145:5601/app/sense 以后更新
- 精美对UI设计界面赏析
最美的UI设计界面赏析 . 喜欢就关注我吧
- JS高级——变量提升
JS执行过程 1.首先是预解析:预解析过程最重要的是提升,在JavaScript代码在预解析阶段,会对以var声明的变量名,和function开头的语句块,进行提升操作 2.执行操作 全局中解析和执行 ...
- c#——值类型与引用类型
值类型传的是值 引用类型传的是地址
- js 学习笔记---基本概念
早已接触javascript多年之后,竟然还有这些概念混淆不清,毫不知情,说出来真实无地自容 ! 1.使用严格模式,"use strict",虽然不适用,但是要知道,以免别人使用时 ...