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实现带错误处理功能的远程文件读取方法
Apr 29 Python
python生成器generator用法实例分析
Jun 04 Python
Python验证企业工商注册码
Oct 25 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
深入理解NumPy简明教程---数组3(组合)
Dec 17 Python
深入浅出分析Python装饰器用法
Jul 28 Python
Python中函数参数匹配模型详解
Jun 09 Python
Django 路由层URLconf的实现
Dec 30 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
Feb 07 Python
python获取响应某个字段值的3种实现方法
Apr 30 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
python实现黄金分割法的示例代码
Apr 28 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实现水仙花数示例分享
2014/04/03 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
pandas数据处理进阶详解
2019/10/11 Python
Python的历史与优缺点整理
2020/05/26 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
人力资源专员自我评价怎么写
2013/09/19 职场文书
销售自荐信
2013/10/22 职场文书
客户答谢会活动方案
2014/08/31 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
学位证书委托书
2014/09/30 职场文书
2014年林业工作总结
2014/12/05 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
生日宴会祝酒词
2015/08/10 职场文书
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python