Python实例方法、类方法、静态方法的区别与作用详解


Posted in Python onMarch 25, 2019

本文实例讲述了Python实例方法、类方法、静态方法的区别与作用。分享给大家供大家参考,具体如下:

Python中至少有三种比较常见的方法类型,即实例方法,类方法、静态方法。它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文。

首先,这三种方法都定义在类中。下面我先简单说一下怎么定义和调用的。(PS:实例对象的权限最大。)

实例方法

    定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);

    调用:只能由实例对象调用。

类方法

    定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);

    调用:实例对象和类对象都可以调用。

静态方法

    定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法

    调用:实例对象和类对象都可以调用。

实例方法

简而言之,实例方法就是类的实例能够使用的方法。这里不做过多解释。

类方法

使用装饰器@classmethod

原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,那么这个方法就可以定义为类方法。另外,如果需要继承,也可以定义为类方法。

如下场景:

假设我有一个学生类和一个班级类,想要实现的功能为:
    执行班级人数增加的操作、获得班级的总人数;
    学生类继承自班级类,每实例化一个学生,班级人数都能增加;
    最后,我想定义一些学生,获得班级中的总人数。

思考:这个问题用类方法做比较合适,为什么?因为我实例化的是学生,但是如果我从学生这一个实例中获得班级总人数,在逻辑上显然是不合理的。同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的。

# -*- coding:utf-8 -*-
class ClassTest(object):
  __num = 0
  @classmethod
  def addNum(cls):
    cls.__num += 1
  @classmethod
  def getNum(cls):
    return cls.__num
  # 这里我用到魔术函数__new__,主要是为了在创建实例的时候调用人数累加的函数。
  def __new__(self):
    ClassTest.addNum()
    return super(ClassTest, self).__new__(self)
class Student(ClassTest):
  def __init__(self):
    self.name = ''
a = Student()
b = Student()
print(ClassTest.getNum())

运行结果:

2

静态方法

使用装饰器@staticmethod

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

譬如,我想定义一个关于时间操作的类,其中有一个获取当前时间的函数。

# -*- coding:utf-8 -*-
import time
class TimeTest(object):
  def __init__(self, hour, minute, second):
    self.hour = hour
    self.minute = minute
    self.second = second
  @staticmethod
  def showTime():
    return time.strftime("%H:%M:%S", time.localtime())
print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print(nowTime)

运行结果:

08:55:54
08:55:54

如上,使用了静态方法(函数),然而方法体中并没使用(也不能使用)类或实例的属性(或方法)。若要获得当前时间的字符串时,并不一定需要实例化对象,此时对于静态方法而言,所在类更像是一种名称空间。

其实,我们也可以在类外面写一个同样的函数来做这些事,但是这样做就打乱了逻辑关系,也会导致以后代码维护困难。

以上就是我对Python的实例方法,类方法和静态方法之间的区别和作用的简要阐述。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python中的reduce内建函数使用方法指南
Aug 31 Python
python实现端口转发器的方法
Mar 13 Python
python中lambda与def用法对比实例分析
Apr 30 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
Python比较配置文件的方法实例详解
Jun 06 Python
python在openstreetmap地图上绘制路线图的实现
Jul 11 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 Python
详解Python装饰器
Mar 25 #Python
详解用python自制微信机器人,定时发送天气预报
Mar 25 #Python
Python3.5实现的三级菜单功能示例
Mar 25 #Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 #Python
Python for循环与range函数的使用详解
Mar 23 #Python
详解Python读取yaml文件多层菜单
Mar 23 #Python
详解Python数据分析--Pandas知识点
Mar 23 #Python
You might like
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
javascript Prototype 对象扩展
2009/05/15 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
python函数形参用法实例分析
2015/08/04 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
印度民族服装购物网站:BIBA
2019/08/05 全球购物
电钳专业个人求职信
2014/01/04 职场文书
银行贷款承诺书
2014/03/29 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL