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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
Django返回json数据用法示例
Sep 18 Python
对Python 数组的切片操作详解
Jul 02 Python
Python切片操作去除字符串首尾的空格
Apr 22 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
python实现两个一维列表合并成一个二维列表
Dec 02 Python
通过实例学习Python Excel操作
Jan 06 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 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 字符串分割和比较
2009/10/06 PHP
理解php原理的opcodes(操作码)
2010/10/26 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
javascript document.referrer 用法
2009/04/30 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
浅析node.js中close事件
2014/11/26 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
js实现飞机大战游戏
2020/08/26 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
Python基础语法(Python基础知识点)
2016/02/28 Python
详解Python中如何写控制台进度条的整理
2018/03/07 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
浅谈Python type的使用
2019/11/19 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
新三好学生主要事迹
2014/01/23 职场文书
小学生获奖感言范文
2014/02/02 职场文书
师德师风自我评价范文
2014/09/11 职场文书
党支部书记四风问题整改措施
2014/09/24 职场文书
Django框架之路由用法
2022/06/10 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android