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的Supervisor进行进程监控以及自动启动
May 29 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 Python
python引用(import)某个模块提示没找到对应模块的解决方法
Jan 19 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
Python @property原理解析和用法实例
Feb 11 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
python rsa-oaep加密的示例代码
Sep 23 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 Python
Flask中jinja2的继承实现方法及实例
Mar 03 Python
Python学习之迭代器详解
Apr 01 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
PHP开发大型项目的一点经验
2006/10/09 PHP
资料注册后发信小技巧
2006/10/09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
举例讲解Python中is和id的用法
2015/04/03 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
Python遍历numpy数组的实例
2018/04/04 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
python实现密码强度校验
2020/03/18 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
医生自荐信
2013/10/11 职场文书
预备党员综合考察材料
2014/05/31 职场文书
土建技术员岗位职责
2015/04/11 职场文书
道歉信怎么写
2015/05/12 职场文书
经营场所使用证明
2015/06/19 职场文书
Hive HQL支持2种查询语句风格
2022/06/25 数据库