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通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
Python正则表达式分组概念与用法详解
Jun 24 Python
Python subprocess模块详细解读
Jan 29 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
python数据归一化及三种方法详解
Aug 06 Python
python面向对象 反射原理解析
Aug 12 Python
Pandas-Cookbook 时间戳处理方式
Dec 07 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
用python制作个音乐下载器
Jan 30 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 和 MySQL 基础教程(二)
2006/10/09 PHP
destoon官方标签大全
2014/06/20 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
Convert Seconds To Hours
2007/06/16 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
详解Python中的条件判断语句
2015/05/14 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
详解Python绘图Turtle库
2019/10/12 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
外贸业务员的岗位职责
2013/11/23 职场文书
班级活动策划书
2014/02/06 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
法人授权委托书
2014/09/16 职场文书
运动员加油词
2015/07/18 职场文书
安全责任协议书范本
2016/03/23 职场文书