浅谈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编写简单的HTML页面合并脚本
Jul 11 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
Django实现学员管理系统
Feb 26 Python
Python 日志logging模块用法简单示例
Oct 18 Python
python小项目之五子棋游戏
Dec 26 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
Pandas之缺失数据的实现
Jan 06 Python
python 制作本地应用搜索工具
Feb 27 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 地址栏信息的获取代码
2009/01/07 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
python实现批量解析邮件并下载附件
2018/06/19 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
HTML5计时器小例子
2013/10/15 HTML / CSS
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
CNC数控操作工岗位职责
2013/11/19 职场文书
教师节活动主持词
2014/04/02 职场文书
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS