浅谈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实现搜索文本文件内容脚本
Jun 22 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python实现中文文本分句的例子
Jul 15 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
Django 再谈一谈json序列化
Mar 16 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
TensorFlow固化模型的实现操作
May 26 Python
python 密码学示例——理解哈希(Hash)算法
Sep 21 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
python实现简单石头剪刀布游戏
Oct 24 Python
python基础之//、/与%的区别详解
Jun 10 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对文件进行加锁、解锁实例
2015/01/23 PHP
Jquery中删除元素的实现代码
2011/12/29 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
JavaScript重载函数实例剖析
2016/05/13 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
jQuery实现边框动态效果的实例代码
2016/09/23 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
zookeeper python接口实例详解
2018/01/18 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
《再别康桥》教学反思
2014/02/12 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
校长寄语大全
2014/04/09 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
求职自荐信怎么写
2015/03/04 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
生活小常识广播稿
2015/08/19 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
表扬信范文
2019/04/22 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
python代码实现扫码关注公众号登录的实战
2021/11/01 Python