Python 探究类方法和静态方法的使用

本文详细解析了Python中类方法与静态方法的区别与应用。类方法通过@classmethod装饰器定义,可以访问类属性,参数传入cls;静态方法通过@staticmethod装饰器定义,无法访问实例或类属性,更像独立函数,节省内存。

类方法与静态方法


普通方法:

def fun_name(self,...):
	pass
外部用实例调用

静态方法:

@staticmethod

1.不能访问实例属性
2.参数不能传入self
3.与类相关但是不依赖类与实例的方法


类方法:

@classmethod

1.不能访问实例属性
2.参数必须传入cls(代表了此类对象区别于self代表的实例对象),并且还需要用此来调用类属性

cls.类属性名

@classmethod @staticmethod区别
实验一:

class A(object):
    x = 20
    def foo(self,x):
        print(f"x={self.x}") # x=20
        print(f"self",self)  # self <__main__.A object at 0x0000000002EE9508>
    @classmethod
    def class_foo(cls,x):
        print(f"x={cls.x}")  # x=20
        print("cls:",cls)  # cls: <class '__main__.A'>
    @staticmethod
    def static_foo(x):
        print(f"x={x}")  # x=20
a = A()
a.foo(20)
a.class_foo(20)
a.static_foo(20)

实验二:

class A(object):
    x = 20
    @classmethod
    def foo(self,x):
        print(f"x={self.x}") # x=20
        print(f"self",self)  # self <class '__main__.A'>
    @classmethod
    def class_foo(cls,x):
        print(f"x={cls.x}")  # x=20
        print("cls:",cls)  # cls: <class '__main__.A'>
    @classmethod
    def static_foo(x):
        print(f"x={x}")  
a = A()
a.foo(20)
a.class_foo(20)
a.static_foo(20)  # builtins.TypeError: static_foo() takes 1 positional argument but 2 were given

实验一和实验二对比,发现,@classmethod的使用需要传入self或者cls,否则会报错


实验三:

class A(object):
    x = 20
    def foo(self,x):
        print(f"x={self.x}") # x=20
        print(f"self",self)  # self <__main__.A object at 0x0000000002E8A548>
    def class_foo(cls,x):
        print(f"x={cls.x}")  # x=20
        print("cls:",cls)  # cls: <__main__.A object at 0x0000000002E8A548>
    @staticmethod
    def static_foo(x):
        print(f"x={x}")  # x=20
a = A()
a.foo(20)
a.class_foo(20)
a.static_foo(20)  

实验三发现cls和self起到同样的作用


总结:
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。
类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
普通对象方法至少需要一个self参数,代表类对象实例
类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。
由于静态方法不需要使用self或者cls来实例化属性,所以相对于后两者,前者(静态方法)是比较省内存的


这个是完整源码 python实现 Flask,Vue 【python毕业设计】基于Python的Flask+Vue物业管理系统 源码+论文+sql脚本 完整版 数据库是mysql 本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语软件开发平台,依据需求分析开展控制模块制做数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语软件开发平台,依据需求分析开展控制模块制做数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语软件开发平台,依据需求分析开展控制模块制做数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试性能指标。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。本文首先实现了基于Python的Flask+Vue物业管理系统技术的发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值