浅谈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编写一个国际象棋AI程序
Nov 28 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
Aug 28 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
Python简单基础小程序的实例代码
Apr 28 Python
django foreignkey(外键)的实现
Jul 29 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
python torch.utils.data.DataLoader使用方法
Apr 02 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
Jul 13 Python
Python开发工具Pycharm的安装以及使用步骤总结
Jun 24 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实现网上点歌(二)
2006/10/09 PHP
mysql+php分页类(已测)
2008/03/31 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
薪资那么高的Web前端必看书单
2017/10/13 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
Python实现二维有序数组查找的方法
2016/04/27 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
函授大专自我鉴定
2013/11/01 职场文书
大学活动策划书范文
2014/01/10 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
怎样写观后感
2015/06/19 职场文书
初一语文教学反思
2016/03/03 职场文书
带你了解Java中的ForkJoin
2022/04/28 Java/Android