Python 静态方法、类方法
今天我们来讨论一下Python类中所存在的特殊方法——静态方法、类方法。
一.定义
静态方法:
一种简单函数,符合以下要求:
1.嵌套在类中。
2.没有self参数。
特点:
1.类调用、实例调用,静态方法都不会接受自动的self参数。
2.会记录所有实例的信息,而不是为实例提供行为。
类方法:
一种函数,符合以下特征
1.类调用、或实例调用,传递的参数是一个类对象。
二.需要特殊方法的情况(用途)
程序需要处理与类而不是与实例相关的数据。也就是说这种数据信息通常存储在类自身上,不需要任何实例也可以处理。
例如:
1.记录有一个类创建的实例的数目。
2.维护当前内存中一个类的所有实例的列表。
以上情况也可以同以下方式解决:
在类定义之外生成一个的简单函数
例1:简单函数.py
# 记录一个类创建的实例的数目 def printNumInstance(): # 打印出创建实例的数量
print "Number of instance created:", Spam.numInstance # 调用类数据属性 class Spam:
numInstance = 0
def __init__(self):
Spam.numInstance = Spam.numInstance + 1 # 每创建一个类,就自加一次
输出结果:
>>> a = Spam()
>>> b = Spam()
>>> c = Spam()
>>> printNumInstance()
Number of instance created: 3
>>> Spam.numInstance
3
因为类名称对简单函数而言,是可读取的全局变量,所以看到上例可以正常工作。
此外,函数名变成了全局变量,故仅适用于这个单一模块。
这样处理的缺点如下:
1.给文件的作用域添加了一个额外的名称,该名称仅能处理单个的类,不能应付多个类需要处理的情况。
2.该函数与类的直接关联很小,函数的定义可能在数百行代码之外的位置。
3.该函数位于类的命名空间之外,子类不能通过重新定义来代替或扩展它。
三.实例方法、静态方法、类方法
三种方法如例2所示
例2.方法.py
# -*- coding:utf-8 -*-
class Methods:
"""实例方法、静态方法、类方法"""
def imeth(self, x):
print self, x def smeth(x): # 静态方法不需要self参数
print x def cmeth(cls, x): # 类方法需要一个类参数
print cls, x # 要设计静态方法和类方法,如下,需调用内置函数staticmethod和clsssmethod. smeth = staticmethod(smeth) # 重新赋值方法名称,这些赋值语句会覆盖稍早由def所做的赋值
cmeth = classmethod(cmeth)
三种方法调用方式(实例调用,类调用)
1.实例方法调用
实例方法调用一定要将类实例化,方可通过实例调用。
from method import Methods # 导入模块
>>> obj = Methods() #实例化
>>> obj.imeth(1) #实例调用
<method.Methods instance at 0x02D6BD50> 1 #变为imeth(obj, 1)
>>> Methods.imeth(obj, 1) #类调用
<method.Methods instance at 0x02D6BD50> 1 #变为imeth(obj, 1)
实例方法调用时,Python会把实例自动传入实例方法第一个(最左侧)参数self(也可写成其他变量,但默认写成self)。
2.静态方法调用
静态方法调用时不需要实例参数。
>>> Methods.smeth(3) # 类调用
3 # 没有实例被传入
>>> obj.smeth(3) # 实例调用
3 # 实例没有传入
3.类方法调用
类方法调用时,Python会把类(不是实例)传入类方法第一个(最左侧)参数cls(默认)。
>>> Methods.cmeth(5) #类调用
method.Methods 5 #变为cmeth(Methods, 5)
>>> obj.cmeth(5) #实例调用
method.Methods 5 #变为cmeth(Methods, 5)
Python 静态方法、类方法的更多相关文章
- python静态方法类方法属性方法
Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...
- Python静态方法 类方法
通常情况下,类中函数中定义的所有函数,,都是对象的绑定方法,除此之外,还有专门的静态方法和类方法,这两个是专门给类使用的,但是对象非要调用也是不会报错的. 对象在调用的时候会把自己传递给self,也就 ...
- python 静态方法、类方法(二)
<Python静态方法.类方法>一文中曾用在类之外生成函数的方式,来计算类的实例的个数.本文将探讨用静态方法和类方法来实现此功能. 一使用静态方法统计实例 例1.static.py # - ...
- 关于python的类方法、实例方法和静态方法区别
python的类方法需要在方法前面加装饰器:@classmethod ,静态方法是在方法前面加装饰器:@staticmethod. 类方法.类属性是属于类自身,属于类自身的命名空间,和实例方法.实例属 ...
- Python静态方法(staticmethod)和类方法(classmthod)
Python静态方法(staticmethod)和类方法(classmthod)翻了翻之前的笔记,也刚好看到一篇不错的blog,关于静态方法和类方法的,方便以后查阅,就写在这里了,废话不多说,直接上代 ...
- Python 静态方法、类方法和属性方法
Python 静态方法.类方法和属性方法 静态方法(staticmethod) staticmethod不与类或者对象绑定,类和实例对象都可以调用,没有自动传值效果,Python内置函数staticm ...
- IOS—静态方法(类方法)和实例方法
1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象 函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类 函数) c).静态方法 ...
- IOS基础——静态方法(类方法)和实例方法
1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象 函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类 函数) c).静态方法 ...
- Java学习日记基础(五)——类、对象之this、静态变量(类变量)、静态方法(类方法)、四大特征
this 赵本山问奥尼尔:“我的爸爸的爸爸是谁?” 奥尼尔:“不知道” 赵本山:“你傻啊,是我爷爷” 奥尼尔回去问科比:“我的爸爸的爸爸是谁?” 科比:“不知道” 奥尼尔:”你傻啊,是赵本山的爷爷“ ...
- python类的实例方法\静态方法\类方法区别解析(附代码)
前言 搞了好久python,一直搞得不太清楚这几种类的方法,今天花时间好好测试一下,算是弄懂点皮毛吧. 三种方法的不同 先剽窃个图看一下 可以看到,实例是三种方法都可以调用的,而类只可以调用两种.所以 ...
随机推荐
- 【搬砖】安卓入门(2)- Java开发编程基础--进制转换和运算符
02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 ...
- Android DEX 基础
转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/5736305.html本文出自[赵彦军的博客] 1.什么是dex? 简单说就是优化后的android版.exe ...
- iOS快速集成友盟社会化分享功能(v6.1.1)
1. U-Share SDK集成 1.1 下载U-Share SDK 通过iOS社会化组件选择所需的社交平台后进行下载,下载链接http://dev.umeng.com/social/ios/sdk ...
- 2016总结Android面试题
1.简单的设计模式:单例模式:在系统中一个类只有一个实例. 分为懒汉模式和饿汉模式.饿汉模式的代码如下:public class Singleten{private static singleten ...
- IT菜鸟的生存指南(二)新手村任务
此文献给那些刚误入IT行业的小菜鸟们,此文无法教你如何"当上CEO,迎娶白富美",那是电视剧情.现实IT行业里危机重重,竞争激励.这里教你的是如何生存.生存.生存- 恭(不)喜(幸 ...
- iOS UIApplication sharedapplication用法
应用中打开其他应用 我们来讨论一下,在iOS开发中,如何实现从app1打开app2. 基本的思路就是,可以为app2定义一个URL,在app1中通过打开这个URL来打开app2,在此过程中,可以传送一 ...
- 30天的php学习之路——第一天开端
因项目紧急只留给了我4周时间学习php.谨以此文记录我的php学习历程,仅供参考,若有错误请指正. 之前对php有过一些了解,一些语法和习惯和C#差距有些大,所以第一天准备对php中的符号有个全面的了 ...
- 当我们在谈论kmeans(2)
本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 其他:建设中- 当我们在谈论kmeans(2 ...
- 在Ubuntu Server 14.04中搭建FTP服务器(VMWare)
自己搭建ftp服务器,方便主机与虚拟机中的Ubuntu传输文件. 选用的ftp软件为vsftpd. 1.命令行: sudo apt-get install vsftpd 2.安装完配置: vsftpd ...
- 给Eclipse提速的7个技巧
这篇文章只是关注如何让Eclipse运行得更快.每个技巧都针对Windows.Linux和MacOS用户详细说明.在使用所有优化技巧之后,Eclipse应该能在10秒内启动,并且比以前运行得更流畅. ...