浅谈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中的元类(metaclass)
Feb 14 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
用实例分析Python中method的参数传递过程
Apr 02 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
Python lxml模块安装教程
Jun 02 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
Python中协程用法代码详解
Feb 10 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
解析Python3中的Import
Oct 13 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
python如何爬取网页中的文字
Jul 28 Python
实例详解Python的进程,线程和协程
Mar 13 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
第四节--构造函数和析构函数
2006/11/16 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
php类常量用法实例分析
2015/07/09 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
vue实现登录功能
2020/12/31 Vue.js
常见的python正则用法实例讲解
2016/06/21 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
python实现按长宽比缩放图片
2018/06/07 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
Python 防止死锁的方法
2020/07/29 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
介绍一下#error预处理
2015/09/25 面试题
外包公司软件测试工程师
2014/11/01 面试题
毕业生自我推荐
2013/11/04 职场文书
企业年度评优方案
2014/06/02 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2014年团队工作总结
2014/11/24 职场文书
鲁迅故居导游词
2015/02/05 职场文书
个人优缺点总结
2015/02/28 职场文书
如何写新闻稿
2015/07/18 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python