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

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

实例方法

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

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

类方法

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

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

静态方法

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

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

实例方法

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

类方法

使用装饰器@classmethod。

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

如下场景:

假设我有一个学生类和一个班级类,想要实现的功能为:

执行班级人数增加的操作、获得班级的总人数;

学生类继承自班级类,每实例化一个学生,班级人数都能增加;

最后,我想定义一些学生,获得班级中的总人数。

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

classClassTest(object):__num =0

@classmethoddefaddNum(cls):

cls.__num += 1@classmethoddefgetNum(cls):return cls.__num

#这里我用到魔术函数__new__,主要是为了在创建实例的时候调用人数累加的函数。

def __new__(self):

ClassTest.addNum()return super(ClassTest, self).__new__(self)classStudent(ClassTest):def __init__(self):

self.name= ''a=Student()

b=Student()print(ClassTest.getNum())

静态方法

使用装饰器@staticmethod。

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

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

importtimeclassTimeTest(object):def __init__(self, hour, minute, second):

self.hour=hour

self.minute=minute

self.second=second

@staticmethoddefshowTime():return time.strftime("%H:%M:%S", time.localtime())print(TimeTest.showTime())

t= TimeTest(2, 10, 10)

nowTime=t.showTime()print(nowTime)

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

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

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

面向对象知识补充

python的用途实例-python中类方法,实例方法,静态方法的作用和区别相关推荐

  1. python的用途实例-python 星号(*)的多种用途

    结论 概括的来说,就是对修饰的变量进行拆分, 对修饰的形式参数进行参数聚集. 单*号,将被修饰的变量按元素方式拆分, 对修饰的形式参数进行参数聚集. 双**号,将被修饰的变量按键值对进行拆分, 对修饰 ...

  2. python的用途实例-python中pass语句意义与作用(实例分析)

    想必大家都是刚刚才开始接触python这门语言的,今天这篇文章就来带大家来了解一下python这门语言之中常常会用到的一个语句pass语句.想必大家都很好奇python中pass作用是什么,接下来我就 ...

  3. python的用途实例-Python实例方法、类方法、静态方法的区别与作用详解

    本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...

  4. python的用途实例-python进程池作用展示及实例解析

    在以下的文章之中我们来了解一下什么是python中的进程池.了解一下python进程池的相关知识,以及进程池在python编程之中能起到什么样的作用. 进程池 Pool类描述了一个工作进程池,他有几种 ...

  5. python的用途实例-Python基础之函数原理与应用实例详解

    本文实例讲述了Python基础之函数原理与应用.分享给大家供大家参考,具体如下: 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体 ...

  6. python的用途实例-python assert的用处示例详解

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  7. python装饰器实例-python装饰器实例大详解

    原标题:python装饰器实例大详解 一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我 ...

  8. python多线程爬虫实例-Python实现多线程爬虫

    编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...

  9. python主要用途-学习Python的三大主要用途

    如果你想学Python,或者你刚开始学习Python,那么你可能会问:"我能用Python做什么?"这个问题不好回答,因为Python用途太多了,以至于小编不知道如何回答,但是我可 ...

最新文章

  1. 滑动定位的三种方法,以及热启动(五)
  2. 习题3-3 数数字(Digit Counting , ACM/ICPC Danang 2007, UVa1225)
  3. python经典程序练习题-99道经典练习题助你全面掌握python基础知识,附技巧答案...
  4. 申请了团队blog,不知道能否给开通
  5. 求排序一堆整数,数据都是有限范围的和有限个数的,对他们进行排序,要求O(n)的时间复杂度....
  6. 25个实用编程小技巧
  7. main.js中的Vue.config.productionTip = false
  8. centos7装单机hadoop2.7.3
  9. 演练 小说排行榜 0912
  10. 转载 linux系统调用和库函数调用的区别
  11. 如何让MySQL语句执行加速
  12. 将获得到的json赋值到下拉框
  13. SpringBoot+Vue实现前后端分离的实习管理系统
  14. 一个计算机能插两块显卡吗,双显卡有什么好处(一台电脑安装两张不同的显卡)...
  15. 算法的复杂度度量--时间复杂度以及空间复杂度
  16. 【用python写一个简易的消息轰炸代码】
  17. 王者转号仅显示可转移的服务器,王者荣耀转移账号是免费的吗 角色转移进度怎么查看...
  18. F5负载均衡器通过iRules实现http应用的灵活转发
  19. AMBA总线协议AHB、APB、AXI对比分析
  20. linux复制操作 cp: -r not specified; omitting directory XXX 错误

热门文章

  1. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
  2. C#开发微信门户及应用(5)--用户分组信息管理
  3. IT项目监理的三种模式比较
  4. 程序员常用的六大技术博客类
  5. java 2类与对象[学堂在线]
  6. Git高速入门——Git安装、创建版本号库以及经常使用命令
  7. html中 alt 和 title 的区别
  8. [转]volley-retrofit-okhttp之我们该如何选择网路框架
  9. LeetCode Perfect Squares
  10. JavaScript的过去、现在和未来--过去