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多线程编程(一):threading模块综述
Apr 05 Python
介绍Python的@property装饰器的用法
Apr 28 Python
Python中的默认参数详解
Jun 24 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
Python通过future处理并发问题
Oct 17 Python
Django中Forms的使用代码解析
Feb 10 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
浅析python参数的知识点
Dec 10 Python
python异步Web框架sanic的实现
Apr 27 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 Python
pycharm配置QtDesigner的超详细方法
Jan 25 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
如何在PHP中进行身份认证
2006/10/09 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php模板引擎技术简单实现
2016/03/15 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
临床医师专业个人自我评价
2014/01/08 职场文书
优秀员工表扬信
2014/01/17 职场文书
婚宴领导致辞
2015/07/28 职场文书
母亲节主题班会
2015/08/14 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
高一化学教学反思
2016/02/22 职场文书
详解Redis瘦身指南
2021/05/26 Redis
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏