本文实例讲述了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实例方法、类方法、静态方法的区别与作用详解...相关推荐

  1. python数组对应元素相乘_python的几种矩阵相乘的公式详解

    1. 同线性代数中矩阵乘法的定义: np.dot() np.dot(A, B):对于二维矩阵,计算真正意义上的矩阵乘积,同线性代数中矩阵乘法的定义.对于一维矩阵,计算两者的内积.见如下Python代码 ...

  2. python导入模块的变量_python 环境变量和import模块导入方法(详解)

    1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 for ...

  3. python实例化是什么意思_Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  4. python黑帽编程视频_Python黑帽编程 3.4 跨越VLAN详解

    VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个VALN,也可以跨越物理网络障碍,将不同子网中的用户划到同一个VLA ...

  5. python内存的回收机制_python的内存管理和垃圾回收机制详解

    简单来说python的内存管理机制有三种 1)引用计数 2)垃圾回收 3)内存池 接下来我们来详细讲解这三种管理机制 1,引用计数: 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用 ...

  6. python跳一跳编程构造_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

  7. python中unicode编码表_Python中的字符串操作和编码Unicode详解

    本文主要给大家介绍了关于 Python中的字符串操作和编码Unicode的一些知识,下面话不多说,需要的朋友们下面来一起学习吧. 字符串类型 str:Unicode字符串.采用''或者r''构造的字符 ...

  8. python 公众号文章发布_python如何导出微信公众号文章方法详解

    1.安装wkhtmltopdf 下载地址:https://wkhtmltopdf.org/downloads.html 我测试用的是windows的,下载安装后结果如下 2 编写python 代码导出 ...

  9. float函数python作用_python函数每日一讲 - float函数类型转换详解|python教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 函数描述 float([x]) 函数将数字或数字的字符串表示形式转换为与它等效的有符号浮点数..如果参数x ...

  10. python中continue语句的作用_Python中Continue语句的用法的举例详解

    Python continue语句返回while循环的开始.Continue语句拒绝在该循环的当前迭代中的其余语句执行并移动控制返回到循环的顶部(开始位置). continue语句可以在while和f ...

最新文章

  1. 打开共享文件闪退怎么解决_文件共享解决方案-随时随地共享同步访问文件
  2. html动态报警图片,报警记录.html
  3. android 9图片报错,Android2.1加载9Patch图片运行后报错
  4. levelshifter工作原理_从滑块问题看Level Shifter中Latch的状态转换
  5. windows下C语言多线程编程
  6. pdg快速转换pdf源码_在手机上快速免费把图片转换成PDF文件
  7. SQL2000和SQL2005同时安装问题(转载)
  8. mysql ansi导入_mysql导入csv的4种报错的解决方法
  9. GDI GDI+ 的区别
  10. setting-mirrorO以及下载jar包流程简介
  11. 分数加减法混合计算机,1649.新人教版五年级数学下册第三课 分数加减混合运算(教案)(教学设计)(国家级一等奖、适合公开课).doc...
  12. springboot集成jooq异常集合
  13. chosen插件使用
  14. SQL中的DML、DDL、DCL分别是什么意思
  15. IE下不显示自定义错误页面
  16. .设计一个Student类,该类中包括学生的姓名和成绩。创建Student类的5个对象,如下所示: 姓名 成绩 刘德华 85 张学友 100 刘杰 65 章子怡 58 周迅 76 将以上5个对象
  17. 如何在html中选择wrap,jQuery wrap()方法怎么用?
  18. 常见问题 html5页面模板,html5+css3实现403程序报错页面模板特效
  19. File类以及文件过滤器
  20. 《概率论与数理统计》之事件的相互关系及运算

热门文章

  1. 如何打造BCH使用的刚性需求?
  2. bootstrap使用总结
  3. Web页面中png jpg gif webp svg的区别和使用
  4. 聊聊flink的CheckpointScheduler
  5. 稳扎稳打Silverlight(29) - 2.0Tip/Trick之Cookie, 自定义字体, 为程序传递参数, 自定义鼠标右键...
  6. Grunt的配置和使用
  7. spring@PropertySource用法
  8. Unity3D在iOS下为啥不能更新的资料收集
  9. Swift - 多行文本输入框(UITextView)的用法
  10. pxe和kickstart无人值守安装