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学习之asyncore模块用法实例教程
Sep 29 Python
python函数装饰器用法实例详解
Jun 04 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
python数据结构之链表的实例讲解
Jul 25 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
python3.x实现base64加密和解密
Mar 28 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
python装饰器代替set get方法实例
Dec 19 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
Python爬虫之爬取二手房信息
Apr 27 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
javascript self对象使用详解
2016/10/18 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
详解适配器在JavaScript中的体现
2018/09/28 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python利用sklearn包编写决策树源代码
2017/12/21 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
python随机模块random使用方法详解
2020/02/14 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
python破解同事的压缩包密码
2020/10/14 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
印度购物网站:TATA CLiQ
2017/11/23 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
诚信承诺书范文
2014/03/27 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
地陪导游欢迎词
2015/01/26 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS