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 相关文章推荐
简单的通用表达式求10乘阶示例
Mar 03 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
Jun 14 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
解析python的局部变量和全局变量
Aug 15 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
Apr 17 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
Dec 03 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 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
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
php header()函数使用说明
2008/07/10 PHP
php实现cookie加密的方法
2015/03/10 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
javascript 数组的方法集合
2008/06/05 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
python tkinter基本属性详解
2019/09/16 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
基于python实现坦克大战游戏
2020/10/27 Python
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
理工科学生的自我评价
2013/12/15 职场文书
十八届三中全会感言
2014/03/10 职场文书
工作说明书格式
2014/07/29 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
债务纠纷起诉书
2015/05/20 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
Java存储没有重复元素的数组
2022/04/29 Java/Android