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装饰器使用示例及实际应用例子
Mar 06 Python
详解Python中的条件判断语句
May 14 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
Python实现的计算器功能示例
Apr 26 Python
详解Python如何生成词云的方法
Jun 01 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
python的faker库用法
Nov 28 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
如何使用python传入不确定个数参数
Feb 18 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
详解Python中的路径问题
Sep 02 Python
Pyhton模块和包相关知识总结
May 12 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
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
2016/06/24 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
用原生JS实现简单的多选框功能
2017/06/12 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
Angular6新特性之Angular Material
2018/12/28 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
如何查找网页漏洞
2016/06/22 面试题
员工自我鉴定范文
2013/10/06 职场文书
会计专业自我鉴定范文
2013/10/06 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
三好生演讲稿
2014/09/12 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书