浅谈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 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
python实现Decorator模式实例代码
Feb 09 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
python 定时器,轮询定时器的实例
Feb 20 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
深入浅析Python中的迭代器
Jun 04 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
python实现将range()函数生成的数字存储在一个列表中
Apr 02 Python
Python调用C语言程序方法解析
Jul 07 Python
Python 合并拼接字符串的方法
Jul 28 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中MVC的开发经验分享
2012/05/17 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
使用python绘制二维图形示例
2019/11/22 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
十八大标语口号
2014/10/09 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
西柏坡观后感
2015/06/08 职场文书
领导欢送会主持词
2015/07/06 职场文书
幼儿园开学家长寄语(2016春季)
2015/12/03 职场文书
五年级语文教学反思
2016/03/03 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
服务器SVN搭建图文安装过程
2022/06/21 Servers