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

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

1. 函数和方法

1.1 函数:

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

python 复制代码
def fun():
    a = "hello"
    return a

# 函数调用
res = fun()
print(res)

1.2 方法-实例方法(self)

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

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

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

python 复制代码
class A(object):
    count = 0

    def 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参数,所以它也无法访问类成员。静态方法既可以通过对象名调用,也可以通过类名调用。
python 复制代码
class A(object):
    count = 0

    def fun(self):
        b = "world"
        return b

    @staticmethod
    def start():
        print("start-----")

# 不用实例化也能调用
A.start()
# 实例化也能调用
a = A()
a.start()

2.2 类方法

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

例1:

python 复制代码
class Person:
    age = 25
    def printAge(cls):
        print('The age is:', cls.age)
        
Person.printAge = classmethod(Person.printAge)
Person.printAge()

例2:

python 复制代码
class Person:
    age = 25
    @classmethod
    def printAge(cls):
        print('The age is:', cls.age)

Person.printAge()

例1和例2:输出一样!!

所以:@classmethod等价于Person.printAge = classmethod(Person.printAge)

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

以下这个例子很好:

python 复制代码
class DataTest(object):
    day = 0
    month = 0
    year = 0

    def __init__(self, year=0, month=0, day=0):
        self.day = day
        self.month = month
        self.year = year

    def out_date(self):
        print("year :", self.year)
        print("month :", self.month)
        print("day :", self.day)

t = DataTest(2021, 8, 18)
t.out_date()

输出:

python 复制代码
year :2021
month :8
day :18

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

python 复制代码
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 :【类最基本的作用是实例化出一个对象,但是有的时候再实例化之前,就需要先和类做一定的交互,这种交互可能会影响实际实例化的过程,所以必须放在调用构造函数之前。】

python 复制代码
class DataTest(object):
    day = 0
    month = 0
    year = 0

    def __init__(self, year=0, month=0, day=0):
        self.day = day
        self.month = month
        self.year = year

    def out_date(self):
        print("year :", self.year)
        print("month :", self.month)
        print("day :", self.day)

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

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

python 复制代码
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

相关推荐
西猫雷婶23 分钟前
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
开发语言·python·opencv
kiiila24 分钟前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
开发语言·qt
小_太_阳1 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾1 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
老刘莱国瑞1 小时前
STM32 与 AS608 指纹模块的调试与应用
python·物联网·阿里云
唐 城1 小时前
curl 放弃对 Hyper Rust HTTP 后端的支持
开发语言·http·rust
一只敲代码的猪2 小时前
Llama 3 模型系列解析(一)
大数据·python·llama
Hello_WOAIAI2 小时前
批量将 Word 文件转换为 HTML:Python 实现指南
python·html·word
winfredzhang2 小时前
使用Python开发PPT图片提取与九宫格合并工具
python·powerpoint·提取·九宫格·照片
矩阵推荐官hy147623 小时前
短视频矩阵系统种类繁多,应该如何对比选择?
人工智能·python·矩阵·流量运营