参考链接: Python中的类方法与静态方法

一、语法区别

刚接触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装饰(静态方法):经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法。 比如更改环境变量或者修改其他类的属性等能用到静态方法。这种情况可以直接用函数解决,但这样同样会扩散类内部的代码,造成维护困难。至于静态方法就是写在类里的方法,必须用类来调用(极少数情况下使用,一般都在全局里直接写函数了)。

[转载] Python3.0中普通方法、类方法和静态方法的比较相关推荐

  1. 【Python3】中str方法汇总

    一. str类常用方法 1 upper() 字符串全变大写字母 v1 = "ab" value = v1.upper() print(v1,value) 注意对字符串使用upper ...

  2. 【转载】C#中AddRange方法往ArrayList集合末尾添加另一个集合

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,如果需要往一 ...

  3. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  4. python 实例方法和类方法的区别_python中实例方法,类方法和静态方法的区别。...

    实例方法,必须要创建实例才能调用,里面有self关键字,有初始化函数必须对初始化函数进行传参. 类方法,可以直接类名.方法名直接调用,也可以创建实例调用.里面有cls关键字,调用时,直接类名.方法名, ...

  5. php中的setinc,thinkphp3.2.0中setInc方法的源码分析

    下面为大家分享一篇thinkphp3.2.0 setInc方法 源码全面解析,具有很好的参考价值,希望对大家有所帮助. 我们先来看一下setInc的官方示例: 需要一个字段和一个自增的值(默认为1) ...

  6. python 类中方法总结 --- 实例方法、类方法、静态方法

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例 ...

  7. #简明深入# Python 中的 iteritems() 和 items() 函数以及Python2.0到Python3.0的感悟

    Python2.x中 iteritems()函数返回的是一个迭代器,而items() 返回的是一个带序号的列表,在for循环中用法是一样的.但是iteritems()函数因为返回的是迭代器更加节省内存 ...

  8. python类中方法调用自己类的方法_python 类中方法总结 --- 实例方法、类方法、静态方法...

    在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...

  9. Python3.0的新改动

    这篇文章主要介绍了相比于python2.6,python3.0的新特性. 更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动 ...

最新文章

  1. 如何规划创建一个家庭实验室
  2. CreateRemoteThread注入DLL
  3. Remoting 与 Webservice 的区别
  4. Leetcode - 169. Majority Element (多数投票问题)
  5. python统计分析 --- 1.方差分析、t检验
  6. phpcmsV9文章页时间 - 踩坑篇
  7. Selenium自动化测试-3.元素定位(3)
  8. Ubuntu学习日记--Lesson9:显卡工作状态查看命令
  9. CocoaPods 安装
  10. Linux文本模式自动登录,Linux开机自动登录(文本模式)
  11. vba九九乘法表代码_VBA程序控制结构示例-九九乘法表
  12. 机器学习模型评估指标
  13. 第一代操盘手图解“庄家操盘五部曲”;股市不可不知的赚钱法则!
  14. python笔记三之面向对象(继承,封装,多态)
  15. Vue FSC在线编译代码实时预览@vue/repl
  16. python文件比较,判断两个文件是否相同
  17. 计算机研究生学什么课本,计算机研究生到底该怎么读?
  18. 记一次 controller manager and scheduler 重复重启问题分析
  19. Nginx的 allow / deny 理解
  20. asp.net mvc 客户端加验证非空验证数据库是否存在验证

热门文章

  1. Linux更换软件源(国内)阿里云
  2. 依赖配置中心实现注有@ConfigurationProperties的bean相关属性刷新
  3. [2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析
  4. cesium 经纬度绘制点_炫酷大屏地图自定义绘制(一)
  5. openssl 生成证书_CentOS7 httpd(Apache)SSL 证书部署
  6. 数据库设置_CentOS7 - 设置MySQL数据库
  7. 笨办法学python3 pdf 脚本之家_解决python3输入的坑——input()
  8. html高度没有滚动条,Div扩展了页面高度,但没有滚动条
  9. oracle预定义异常
  10. PHP 开启或关闭错误提示