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编写的微博应用
Oct 17 Python
python持久性管理pickle模块详细介绍
Feb 18 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
django+js+ajax实现刷新页面的方法
May 22 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
Feb 25 Python
pytorch+lstm实现的pos示例
Jan 14 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
浅析Python中的随机采样和概率分布
Dec 06 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
ADODB类使用
2006/11/25 PHP
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
PHP 柱状图实现代码
2009/12/04 PHP
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
深入讲解Java编程中类的生命周期
2016/02/05 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
总监职责范文
2013/11/09 职场文书
五好党支部事迹材料
2014/02/06 职场文书
房地产促销活动方案
2014/03/01 职场文书
《钱学森》听课反思
2014/03/01 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
股东授权委托书范本
2014/09/13 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
win10更新失败无限重启解决方法
2022/04/19 数码科技