浅谈python 类方法/静态方法


Posted in Python onSeptember 18, 2020

1.类方法

类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:

@classmethod
def 类方法名(cls [, 形参列表]):
	方法体

要点如下:

  1. @classmethod必须位于方法的上面一行
  2. 第一个参数cls(class的缩写,和前面笔记介绍的self类似),必须要有,代指"类对象"本身。
  3. 调用类方法格式:类名.类方法名(参数列表)。参数列表中不需要也不能给cls参数进行传值,解释器会自动赋值。
  4. 类方法中可以访问实例属性和实例方法会导致错误,因为有类不一定有对象。
  5. 子类继承父类方法时,传入cls是自身对象,而非父类对象。(后面的笔记会有介绍)

代码示例:

class Student:
  count = 0    # 类属性

  """定义方法"""
  @classmethod
  def print_count(cls):
    """cls参数代表类对象"""
    print(Student.count)


"""调用类方法"""
print("调用时,不传递cls参数")
Student.print_count()

运行结果:

调用时,不传递cls参数
0

2.静态方法

在python中,允许定义于”类对象“无关的方法,称为"静态方法"。
"静态方法"和在模块中定义的普通方法没有什么区别,只不过"静态方法"放到了"类的名字变量空间",需要通过类调用。
静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def 静态方法名([形参列表]):
	方法体

要点如下:

  1. @staticmethod必须位于方法上面一行
  2. 调用静态方法格式:类名.静态方法名(参数列表)
  3. 静态方法中访问实例属性和实例方法会导致错误

代码示例:

class Student:
  count = 0      # 类属性

  @staticmethod
  def add(a, b):
    """与类无关的静态方法"""
    """因为静态方法从属于类,所以是可以操作类属性和类方法"""
    print("{0}+{1}={2}".format(a, b, a+b))
    return a + b


# 调用静态方法
Student.add(20, 30)

运行结果:

20+30=50
res=50

3.实例方法/类方法/静态方法的区别

class MyClass:
  # 类属性
  class_attr = 0

  def __init__(self, obj_attr):
    self.obj_attr = obj_attr

  def instance_method(self):
    return "instance method called", self

  @classmethod
  def class_method(cls):
    return "class method called", cls

  @staticmethod
  def static_method():
    return "static method called"


print("调用实例方法")
obj1 = MyClass("obj_attr1")
print(obj1.instance_method())

print("--" * 20)
print("调用类方法")
print(MyClass.class_method())

print("--" * 20)
print("调用静态方法")
print(MyClass.static_method())

运行结果:

调用实例方法
('instance method called', <__main__.MyClass object at 0x10ca93310>)
----------------------------------------
调用类方法
('class method called', <class '__main__.MyClass'>)
----------------------------------------
调用静态方法
static method called

注意: 以下讨论的属性、方法均指公开的类型,非私有的。

实例方法:

  1. 能读取、修改实例属性
  2. 能调用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式:对象名.实例方法名(参数列表),编译器自动传递self参数

类方法:

  1. 不能读取、修改实例属性
  2. 不能用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式:类名.类方法名(参数列表),编译器自动传递cls参数

静态方法:

  1. 不能读取、修改实例属性
  2. 不能用实例方法
  3. 能读取、修改类属性
  4. 能调用类方法
  5. 能调用类静态方法
  6. 调用方式: 类名.静态方法名(参数列表),不需要cls参数
  7. 类方法和静态方法,功能非常相近,可以相互替代, 但是从规范的角度来说,请按照实例方法操作对象,类方法操作类,静态方法为和类无关的通用方法。

以上就是浅谈python 类方法/静态方法的详细内容,更多关于类方法/静态方法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python判断字符串是否纯数字的方法
Nov 19 Python
python设计模式大全
Jun 27 Python
Python线程指南详细介绍
Jan 05 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 Python
Python实现AI换脸功能
Apr 10 Python
Python类super()及私有属性原理解析
Jun 15 Python
详解Python的爬虫框架 Scrapy
Aug 03 Python
Python 使用office365邮箱的示例
Oct 29 Python
python tkinter实现定时关机
Apr 21 Python
python 6行代码制作月历生成器
Sep 18 #Python
python 深度学习中的4种激活函数
Sep 18 #Python
python闭包与引用以及需要注意的陷阱
Sep 18 #Python
python 代码运行时间获取方式详解
Sep 18 #Python
python判断字符串以什么结尾的实例方法
Sep 18 #Python
python绘制趋势图的示例
Sep 17 #Python
Python绘制组合图的示例
Sep 18 #Python
You might like
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
Linux中为php配置伪静态
2014/12/17 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
详解vue-router 初始化时做了什么
2018/06/11 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
利用python发送和接收邮件
2016/09/27 Python
Python算法应用实战之栈详解
2017/02/04 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
python机器学习之KNN分类算法
2018/08/29 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
python实现最速下降法
2020/03/24 Python
python实现文字版扫雷
2020/04/24 Python
Python列表推导式实现代码实例
2020/09/09 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
酒店工程部经理岗位职责
2015/04/09 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
python内置模块之上下文管理contextlib
2022/06/14 Python