浅谈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中for循环的使用方法
May 14 Python
Python中基本的日期时间处理的学习教程
Oct 16 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
Sep 30 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
浅述python2与python3的简单区别
Sep 19 Python
python 实现在一张图中绘制一个小的子图方法
Jul 07 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Python中lru_cache的使用和实现详解
Jan 25 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
简单采集了yahoo的一些数据
2007/02/14 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
python简单的函数定义和用法实例
2015/05/07 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
Python matplotlib画曲线例题解析
2020/02/07 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
python里反向传播算法详解
2020/11/22 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
优秀员工自荐信范文
2013/10/05 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android