浅谈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和Linux系统上的错误
Dec 12 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
python 对字典按照value进行排序的方法
May 09 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
浅析Python 引号、注释、字符串
Jul 25 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
Python OpenCV去除字母后面的杂线操作
Jul 05 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 Python
python glom模块的使用简介
Apr 13 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 smarty模版引擎中的缓存应用
2009/12/11 PHP
php SQL Injection with MySQL
2011/02/27 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
JavaScript中的prototype使用说明
2010/04/13 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python文件的读写和异常代码示例
2017/10/31 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
Python随机函数random()使用方法小结
2018/04/29 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
python保留小数位的三种实现方法
2020/01/07 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
软件工程师面试题
2012/06/25 面试题
Lucene推荐的分页方式是什么?
2015/12/07 面试题
专科毕业生自我鉴定
2013/12/01 职场文书
运动会解说词100字
2014/01/31 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
素质教育学习心得体会
2016/01/19 职场文书
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers