浅谈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通过递归遍历出集合中所有元素的方法
Feb 25 Python
Python数据类型学习笔记
Jan 13 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
Python管理Windows服务小脚本
Mar 12 Python
Django Rest framework之权限的实现示例
Dec 17 Python
python 图片去噪的方法示例
Jul 09 Python
对python while循环和双重循环的实例详解
Aug 23 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
Python 绘制可视化折线图
Jul 22 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
Django项目在pycharm新建的步骤方法
Mar 02 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+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
javascript Array对象基础知识小结
2010/11/16 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
会计工作心得体会
2014/01/13 职场文书
热爱祖国演讲稿
2014/05/04 职场文书
国庆促销活动总结
2014/08/29 职场文书
爱护公物演讲稿
2014/09/09 职场文书
流动人口婚育证明
2014/10/19 职场文书
邀请函格式范文
2015/02/02 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android
Pandas搭配lambda组合使用详解
2022/01/22 Python
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers