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


Posted in Python onAugust 14, 2019

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

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

实例方法

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

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

类方法

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

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

静态方法

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

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

实例方法

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

类方法

使用装饰器@classmethod

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

如下场景:

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

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

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())

静态方法

使用装饰器@staticmethod

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

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

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)

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

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

总结

以上就是我对Python的实例方法,类方法和静态方法之间的区别和作用的简要阐述。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python中声明只包含一个元素的元组数据方法
Aug 25 Python
pymongo为mongodb数据库添加索引的方法
May 11 Python
python图像处理之镜像实现方法
May 30 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
在pycharm中显示python画的图方法
Aug 31 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
Python如何定义有默认参数的函数
Aug 10 Python
python实现腾讯滑块验证码识别
Apr 27 Python
Python日志模块logging用法
Jun 05 Python
Python学习笔记之Break和Continue用法分析
Aug 14 #Python
Python学习笔记之While循环用法分析
Aug 14 #Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 #Python
Python学习笔记之For循环用法详解
Aug 14 #Python
Python学习笔记之Zip和Enumerate用法实例分析
Aug 14 #Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 #Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 #Python
You might like
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
[00:02]DOTA2新版本使用PA至宝后暴击展示
2014/11/19 DOTA
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
Python更换pip源方法过程解析
2020/05/19 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
体育教育专业自荐信范文
2013/12/20 职场文书
供货协议书
2014/04/22 职场文书
跑操口号
2014/06/12 职场文书
启动仪式策划方案
2014/06/14 职场文书
公司合作协议范文
2014/10/01 职场文书
甲午风云观后感
2015/06/02 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis