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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
Python模拟登陆实现代码
Jun 14 Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
Python探索之自定义实现线程池
Oct 27 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
一文了解Python并发编程的工程实现方法
May 31 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
python 实现字符串下标的输出功能
Feb 13 Python
Python图像处理库PIL的ImageFilter模块使用介绍
Feb 26 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
python playwrigh框架入门安装使用
Jul 23 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
asp.net和php的区别点总结
2019/10/10 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
python自动裁剪图像代码分享
2017/11/25 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
python 命令行传入参数实现解析
2019/08/30 Python
Python模块的制作方法实例分析
2019/12/21 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
用python实现学生管理系统
2020/07/24 Python
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
实习生自荐信范文分享
2013/11/27 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2015年实习单位评语
2015/03/25 职场文书
太行山上观后感
2015/06/05 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js