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模块顶层运行的代码引起的一个Bug
Jul 04 Python
Python中 Lambda表达式全面解析
Nov 28 Python
Python实现的圆形绘制(画圆)示例
Jan 31 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
python调试神器PySnooper的使用
Jul 03 Python
python读写配置文件操作示例
Jul 03 Python
Django 框架模型操作入门教程
Nov 05 Python
pytorch 求网络模型参数实例
Dec 30 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
Django如何批量创建Model
Sep 01 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 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字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
python 文件查找及内容匹配方法
2018/10/25 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
Django url 路由匹配过程详解
2021/01/22 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
英文简历自荐信范文
2013/12/11 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
为自己工作观后感
2015/06/11 职场文书
大学入学感言
2015/08/01 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript