python:类中静态方法,类方法和实例方法的使用与区别

news/2025/2/6 12:49:47/

python 类里面常用的方法有3个:静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)

1. 函数和方法

1.1 函数:

函数定义是由def()关键字定义

def fun():a = "hello"return a# 函数调用
res = fun()
print(res)

1.2 方法-实例方法(self)

定义在类中,同样也是由def()定义,但此时不再是函数,而是一种实例化方法

定义的方法默认在括号里面加一个self参数,self 是类本身的实例对象。

在调用的时候,需要先进行实例化

class A(object):count = 0def fun(self):b = "world"return b# A类不能直接调用fun
# print(A.fun())
a = A()
print(a.fun())

2. 静态方法(@staticmethod),类方法(@classmethod)

@staticmethod和@classmethod,就可以不需要实例化,直接类名.方法名()调用。

  • 静态方法对类一无所知,只处理参数
  • 类方法适用于类,因为它的参数始终是类本身。
  • 类方法可以由类及其对象调用。

2.1 静态方法

@staticmethod用于修饰类中的方法,使其可以再不创建类实例的情况下调用方法,这样做的好处是执行效率较高,当然也可像一般方法一样用实例调用该方法。

使用静态方法的好处是,可以在不创建类实例的情况下调用该方法,从而提高代码的灵活性和可重用性。

  • 静态方法可以不带任何参数,由于静态方法没有self参数,所以它无法访问类的实例成员
  • 静态方法也没有cls参数,所以它也无法访问类成员。静态方法既可以通过对象名调用,也可以通过类名调用。
class A(object):count = 0def fun(self):b = "world"return b@staticmethoddef start():print("start-----")# 不用实例化也能调用
A.start()
# 实例化也能调用
a = A()
a.start()

2.2 类方法

  • 类方法是绑定到类而不是其对象的方法。
  • class方法始终附加到一个类,其中第一个参数作为类本身。
  • 不需要实例化,类名称直接调用类方法;实例化也能调用类方法

例1:

class Person:age = 25def printAge(cls):print('The age is:', cls.age)Person.printAge = classmethod(Person.printAge)
Person.printAge()

例2:

class Person:age = 25@classmethoddef printAge(cls):print('The age is:', cls.age)Person.printAge()

例1和例2:输出一样!!
所以:@classmethod等价于Person.printAge = classmethod(Person.printAge)

@classmethod不需要self参数,但第一个参数需要是表示自身类的cls参数。

以下这个例子很好:

class DataTest(object):day = 0month = 0year = 0def __init__(self, year=0, month=0, day=0):self.day = dayself.month = monthself.year = yeardef out_date(self):print("year :", self.year)print("month :", self.month)print("day :", self.day)t = DataTest(2021, 8, 18)
t.out_date()

输出:

year :2021
month :8
day :18

但是如果用户输入的是 “2016-8-1” 这样的字符格式,那么就需要调用Date_test 类前做一下处理:

def get_data(cls, string_date):"""处理'2018-8-18'字符格式"""year, month, day = map(int, string_date.split('-'))return cls(year, month, day)string_date = '2018-8-18'
year, month, day = map(int, string_date.split('-'))
s = DataTest(year, month, day)
print(s.out_date())

那可不可以把这个字符串处理的函数放到 DateTest 类当中呢?

@classmethod :【类最基本的作用是实例化出一个对象,但是有的时候再实例化之前,就需要先和类做一定的交互,这种交互可能会影响实际实例化的过程,所以必须放在调用构造函数之前。】

class DataTest(object):day = 0month = 0year = 0def __init__(self, year=0, month=0, day=0):self.day = dayself.month = monthself.year = yeardef out_date(self):print("year :", self.year)print("month :", self.month)print("day :", self.day)@classmethoddef get_data(cls, string_date):"""处理'2018-8-18'字符格式"""year, month, day = map(int, string_date.split('-'))return cls(year, month, day)

定义一个get_data类方法,处理完字符串后返回这个类的实例对象。这样有一举两得的效果,在处理字符串的同时,还能实现实例化。

r = DataTest.get_data('2018-8-18') 
r.out_date()

参考:
https://zhuanlan.zhihu.com/p/544021480
https://blog.csdn.net/qq_46906413/article/details/124332735


http://www.ppmy.cn/news/1246458.html

相关文章

kotlin 防范竞态

当你调用成员,这个成员可能为null,可能为空值,就必须采用防范竞态条件,这个是 KT 编程的规范化 下面举例: 防范竞态条件【尽量使用 ? 内置函数 空合并操作符】 fun test(){val info: String ? "&q…

class类

如果有一个名为 ExampleClass 的类,可以通过 ExampleClass.class 获取表示该类的 Class 类实例,或者如果你有一个 ExampleClass 类的对象 exampleObject,可以通过 exampleObject.getClass() 来获取。这些 Class 类的实例可以用来在运行时查询…

Web端功能测试方法最有作用的5个点

对于web测试,较之其他软件测试又有所不同,这是细节的不同,这个不同需要我们在不停的测试中去总结的。 web测试正式测试之前,应先确定如何开展测试,不可盲目的测试,讲究方法才能行之有效的提高我们的效…

Linux CenTOS命令备忘

Linux CenTOS命令备忘 2.关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机poweroff 立刻关机 2.重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启reboot 立刻重启3.帮助 –help命令 shutdown --help:ifconfig --help:查看网卡信息m…

汽车电子 -- 车载ADAS之FCTA/FCTB(前方横向来车碰撞预警/制动)

参看:功能定义-前方交通穿行提示&制动 1、前方横向来车碰撞预警/制动 FCTA/FCTB( Front Cross Traffic Alert /Brake) 前方横向来车碰撞预警FCTA( Front Cross Traffic Alert ) 其功能表现为在车辆低速前进时&am…

Net6.0或Net7.0项目升级到Net8.0 并 消除.Net8中SqlSugar的警告

本文基于NetCore3.1或Net6.0项目升级到Net7.0,参考连接:NetCore3.1或Net6.0项目升级到Net7.0-CSDN博客 所有项目按照此步骤操作一遍,完成后再将所有引用的包(即 *.dll)更新升级到最新版(注意:有…

SpringBoot项目启动后自动停止了?

1 现象 2023-11-22T09:05:13.36108:00 DEBUG 17521 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state LivenessState changed to CORRECT 2023-11-22T09:05:13.36208:00 DEBUG 17521 --- [ main] o.s.b.a.Applicat…

免费部署开源大模型 ChatGLM-6B

参考:【大模型-第一篇】在阿里云上部署ChatGLM3-CSDN博客 ChatGLM 是一个开源的、支持中英双语的对话语言模型,由智谱 AI 和清华大学 KEG 实验室联合发布,基于 General Language Model (GLM) 架构,具有 62 亿参数。ChatGLM3-6B 更…