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实现聊天小程序
Mar 13 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
浅析使用Python搭建http服务器
Oct 27 Python
python实现while循环打印星星的四种形状
Nov 23 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
Python xlrd/xlwt 创建excel文件及常用操作
Sep 24 Python
通过代码简单了解django model序列化作用
Nov 12 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
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
html中table数据排序的js代码
2011/08/09 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
详解Vite的新体验
2021/02/22 Javascript
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
python版本的读写锁操作方法
2016/04/25 Python
深入解析Python中的上下文管理器
2016/06/28 Python
python操作 hbase 数据的方法
2016/12/18 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
python实现趣味图片字符化
2019/04/30 Python
python利用7z批量解压rar的实现
2019/08/07 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
python 实现IP子网计算
2021/02/18 Python
汽车维修专业个人求职信范文
2014/01/01 职场文书
银行演讲稿范文
2014/01/03 职场文书
总经理的岗位职责
2014/02/23 职场文书
校庆标语集锦
2014/06/25 职场文书
《迟到》教学反思
2016/02/24 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
2019教师的学习计划
2019/06/25 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书