浅谈python 类方法/静态方法
作者:聂发俊 发布时间:2021-02-23 07:00:54
1.类方法
类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:
@classmethod
def 类方法名(cls [, 形参列表]):
方法体
要点如下:
@classmethod必须位于方法的上面一行
第一个参数cls(class的缩写,和前面笔记介绍的self类似),必须要有,代指"类对象"本身。
调用类方法格式:类名.类方法名(参数列表)。参数列表中不需要也不能给cls参数进行传值,解释器会自动赋值。
类方法中可以访问实例属性和实例方法会导致错误,因为有类不一定有对象。
子类继承父类方法时,传入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 静态方法名([形参列表]):
方法体
要点如下:
@staticmethod必须位于方法上面一行
调用静态方法格式:类名.静态方法名(参数列表)
静态方法中访问实例属性和实例方法会导致错误
代码示例:
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
注意: 以下讨论的属性、方法均指公开的类型,非私有的。
实例方法:
能读取、修改实例属性
能调用实例方法
能读取、修改类属性
能调用类方法
能调用类静态方法
调用方式:对象名.实例方法名(参数列表),编译器自动传递self参数
类方法:
不能读取、修改实例属性
不能用实例方法
能读取、修改类属性
能调用类方法
能调用类静态方法
调用方式:类名.类方法名(参数列表),编译器自动传递cls参数
静态方法:
不能读取、修改实例属性
不能用实例方法
能读取、修改类属性
能调用类方法
能调用类静态方法
调用方式: 类名.静态方法名(参数列表),不需要cls参数
类方法和静态方法,功能非常相近,可以相互替代, 但是从规范的角度来说,请按照实例方法操作对象,类方法操作类,静态方法为和类无关的通用方法。
来源:http://www.niefajun.com/archives/python-%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1-09-%E7%B1%BB%E6%96%B9%E6%B3%95%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95
猜你喜欢
- 新人小菜鸟又来写博客啦!!!没人表示不开心~~(>_<)~~今天我来弄一个简单的关键词提取的代码文章内容关键词的提取分为三大步:
- 本文内容由经典论坛星级会员 lipengadmin 收集整理绝大部分属于转载,有很多还是出自咱们蓝色的经典论坛.*****[第1页目录]**
- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多。RACLE 不论是数据库管理能力还是安全性都是无可非
- Python 正则表达式简介正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增
- 1、简述asp的6个内置对象和其功能答案 : session ,server ,response,request,objectcontext
- 笔者日积月累了许多精彩、实用的Web特效的制作,这些特效几乎都是比较常用的网页特效。现在我就把这些经过
- 格式:Download.asp?FileName=要下载的文件名 代码如下:Dim Stream Dim Co
- Brendan Eich于1995年在Netscape发明了JavaScript语言,这个语言在过去的一些年里曾是一个最被误解的语言,随着A
- 1. __init__ 初始化文件路径,关键字1,关键字2;2. key_match 使用with open 方法,以二进制方式(也可以改成
- 这篇是Nicholas讨论如果防止脚本失控的第二篇,主要讨论了如何重构嵌套循环、递归,以及那些在函数内部同时执行很多子操作的函数。基本的思想
- 如何用SQL 建表? 如下:CREATE TABLE statement
- python是很容易上手的编程语言,但是有些时候使用python编写的程序并不能保证其运行速度(例如:while 和 for),这个时候我们
- RegExp对象的语义和使用:检查字符串匹配获取字符串中的部分内容在原字符串的基础上构建一个新的字符串(包括添加、删除和修改)构建一个Reg
- 一、简单介绍正则表达式是一种小型的、高度专业化的编程语言,并不是python * 有的,是许多编程语言中基础而又重要的一部分。在python中
- pytorch forwod函数在父类中的调用问题背景最近在研究Detetron2的代码结构时,发现有些网络代码里面没有forward函数,
- <pre name="code" class="python">creazy.txt文件
- php有哪些优点?PHP优点:1.入门快,有其它语言基础的程序员二周左右的时间就可以入门,一个月左右的时间基本上就可以开发简单的项目了。2.
- Microsoft SQL Server 7.0安全问题Microsoft Corporation【「Microsoft SQL Serve
- 最近要搭建一个阿里云的LMAP环境,选了CentOS7来做搭建。1.ApacheCentos7默认已经安装httpd服务,只是没有启动。如果
- 如题:在python的函数调用中需要记录时间,下面是记录毫秒时间的方法。import datetimeimport timet1 = dat