Python3.0中普通方法、类方法和静态方法的比较


Posted in Python onMay 03, 2019

一、语法区别

刚接触Python中的面向对象,对于类方法和静态方法难以区分,通过查找知乎、CSDN论坛,废了好大的劲思路才逐渐明朗,所以就总结顺便分享一下。

首先开始编辑代码

# 普通方法、类方法、静态方法的比较
# 普通方法、类方法、静态方法的比较
class Test:
  # 定义类Test的属性
  name = 'python'
  content = '人生苦短,我用python!'
  def normal_method(self): # 普通方法访问类Text的属性
    print(self.content)
  @classmethod #类方法访问Test类的属性,看到@staticmethod我们就知道这个方法并不需要依赖对象本身的状态
  def class_method(cls):
    print(cls.content)
  @staticmethod #静态方法,无法访问Test类的属性,
  def static_method():
    print('content')

进行测试一

t = Test()
t.content = '人生苦短,及时行乐'#设置对象t的属性
 
t.normal_method()
t.class_method()
t.static_method()
 
# 结果
人生苦短,及时行乐
人生苦短,我用python!
content

使用普通方法、类方法和静态方法都可以通过对象(t)进行调用,但是静态方法和类方法无法访问对象的属性,所以更改对象(t)的属性仅仅只是对普通方法起作用。

进行测试二

# Test.content('name')出现错误,普通方法无法通过类调用
Test.class_method()
Test.static_method()
# 结果
人生苦短,我用python!
content

普通方法无法通过类名调用,但静态方法和类方法是可以的。

总结

三种方法都可以通过对象进行调用,但类方法和静态方法无法访问对象属性,类方法通过对象调用获取的仍是类属性(并非对象属性);普通方法无法通过类名调用,类方法和静态方法可以,但静态方法不能进行访问,仅仅只是通过传值得方式(与函数调用相同)

二、简单应用

通过上面的示例仅仅只是知道三种方法的语法区别,下面继续看看三种方法的具体应用区别
示例:用类来实现部分计算器功能,并计算任意两个整数的平方和

1. 普通方法

class Test:
  def __init__(self, num1, num2):
    self.num1 = num1
    self.num2 = num2
  def plus(self):
    result = self.num1 + self.num2
    return result
  def multiply(self):
    result = self.num1 * self.num2
    return result
t1 = Test(3, 3)
m = t1.multiply()
t2 = Test(4, 4)
n = t2.multiply()
t3 =Test(m, n)
sum = t3.plus()
print(sum)

2. 类方法(@classnethod)

class Test:
  def __init__(self, num1, num2):
    self.num1 = num1
    self.num2 = num2
  def plus(self):
    result = self.num1 + self.num2
    return result
  def multiply(self):
    result = self.num1 * self.num2
    return result
  @classmethod
  def sum(cls, num1, num2):
    t1 = Test(3, 3)
    m = t1.multiply()
    t2 = Test(4, 4)
    n = t2.multiply()
    t3 = Test(m, n)
    print(t3.plus())
Test.sum(3, 4)

3.静态方法(@staticmethod)

class Test:
  def __init__(self, num1, num2):
    self.num1 = num1
    self.num2 = num2
  def plus(self):
    result = self.num1 + self.num2
    return result
  def multiply(self):
    result = self.num1 * self.num2
    return result
  @staticmethod
  def sum(num1, num2):
    s = num1 * num1 + num2 * num2
    print(s)
Test.sum(3, 4)

4.总结 

以上三种方法都能实现示例要求的功能。使用类方法时,求和功能的那部分代码并没有放在类(Test)中,而是作为类的一个成员方法,这样的好处是可以简化对象,增加可读性(直接通过参数num1、num2来实现最终功能),但整个过程仍须类(self)参与;使用静态方法时,仅仅需要通过传递两个参数即可实现,单最终结果仍可作为类方法进行访问。

5.延伸

@classmethod装饰(类方法): 它的作用就是有点像静态类,比静态类不一样的就是它可以传进来一个当前类作为第一个参数。
@staticmethod装饰(静态方法):经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法。 比如更改环境变量或者修改其他类的属性等能用到静态方法。这种情况可以直接用函数解决,但这样同样会扩散类内部的代码,造成维护困难。至于静态方法就是写在类里的方法,必须用类来调用(极少数情况下使用,一般都在全局里直接写函数了)。

Python 相关文章推荐
Python中断言Assertion的一些改进方案
Oct 27 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
python Tkinter版学生管理系统
Feb 20 Python
python模拟实现斗地主发牌
Jan 07 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
python实现按日期归档文件
Jan 30 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 Python
Python Flask框架模板操作实例分析
May 03 #Python
Python Flask框架扩展操作示例
May 03 #Python
Python安装Flask环境及简单应用示例
May 03 #Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 #Python
Python3模拟curl发送post请求操作示例
May 03 #Python
零基础使用Python读写处理Excel表格的方法
May 02 #Python
Python TestCase中的断言方法介绍
May 02 #Python
You might like
一个好用的分页函数
2006/11/16 PHP
Php Cookie的一个使用注意点
2008/11/08 PHP
一个PHP分页类的代码
2011/05/18 PHP
php explode函数实例代码
2012/02/27 PHP
实例讲解php实现多线程
2019/01/27 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
form中限制文本字节数js代码
2007/06/10 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
js实时监听文本框状态的方法
2011/04/26 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
python pdb调试方法分享
2014/01/21 Python
Python实现简单的语音识别系统
2017/12/13 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
行政助理岗位职责范文
2013/12/03 职场文书
数学国培研修感言
2014/02/13 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2015年教师节主持词
2015/07/03 职场文书
高二化学教学反思
2016/02/22 职场文书