鱼C论坛

 找回密码
 立即注册
查看: 1798|回复: 3

[已解决]静态方法的作用是什么

[复制链接]
发表于 2023-8-30 10:16:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
没有静态方法
class C:
    def func():
        print("I love FishC")
       
C.func()
I love FishC

有静态方法
class C:
    @staticmethod
    def func():
        print("I love FishC")
   
C.func()
I love FishC

无论有没有静态方法,类都可以直接访问其方法,静态方法是起什么作用的
最佳答案
2023-8-30 10:38:04
本帖最后由 isdkz 于 2023-8-30 10:40 编辑

图片1.png

从这张图中我们可以看到,普通函数的类型为 function

默认定义的方法(不加任何修饰器)为实例方法
实例方法只有在通过实例去调用的时候类型才为 bound method,而其它情况下为 function
Bound method 可以说是 python 本身对函数(function)的一个封装
它会自动帮你把所属对象(包括类对象和实例对象)作为第一个参数传入,所属对象即 of 后面尖括号内包含的内容,bound method 的特殊之处除此之外无他,
如代码中,实例方法 test_im 会将 图片2.png 作为第一参数自动传入。


图片3.png

通过 classmethod 修饰的方法将会成为类方法,类方法不管是通过类还是通过实例调用,该方法类型都为 bound method,只不过此 bound method 非彼 bound method,
通过我的第一张图你可以看出来,它属于类对象,而不是实例对象 图片4.png

图片5.png
不管是通过类还是实例来去调用,它都自动传入了类对象 图片4.png

通过 staticmethod 修饰的方法则是不管何时何地它都只会是 function,
function 就跟一个普普通通的函数一样的职能,也就是说它并不会自动传入任何参数
图片6.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-30 10:17:07 | 显示全部楼层
静态方法的作用是允许类直接调用方法,而不需要创建类的实例。在没有静态方法的情况下,我们需要先创建类的实例,然后通过实例来调用方法。而有了静态方法后,我们可以直接通过类名来调用方法,提高了代码的简洁性和可读性。

在给定的示例中,当没有静态方法时,我们需要先创建类C的实例,然后通过实例来调用func()方法。而当有了静态方法后,我们可以直接使用类名C来调用func()方法,不需要创建实例。

静态方法通常用于不需要访问实例属性或实例方法的情况下,执行与类相关的操作。它们可以被视为类的工具函数,与类的实例无关。静态方法可以帮助我们组织代码,使得相关的功能逻辑集中在类中。

需要注意的是,静态方法不能访问类的实例属性或实例方法,因为它们不与任何特定的实例相关联。因此,静态方法通常用于不需要访问实例状态的情况下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-30 10:18:36 | 显示全部楼层
GPT好像不怎么靠谱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-30 10:38:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-8-30 10:40 编辑

图片1.png

从这张图中我们可以看到,普通函数的类型为 function

默认定义的方法(不加任何修饰器)为实例方法
实例方法只有在通过实例去调用的时候类型才为 bound method,而其它情况下为 function
Bound method 可以说是 python 本身对函数(function)的一个封装
它会自动帮你把所属对象(包括类对象和实例对象)作为第一个参数传入,所属对象即 of 后面尖括号内包含的内容,bound method 的特殊之处除此之外无他,
如代码中,实例方法 test_im 会将 图片2.png 作为第一参数自动传入。


图片3.png

通过 classmethod 修饰的方法将会成为类方法,类方法不管是通过类还是通过实例调用,该方法类型都为 bound method,只不过此 bound method 非彼 bound method,
通过我的第一张图你可以看出来,它属于类对象,而不是实例对象 图片4.png

图片5.png
不管是通过类还是实例来去调用,它都自动传入了类对象 图片4.png

通过 staticmethod 修饰的方法则是不管何时何地它都只会是 function,
function 就跟一个普普通通的函数一样的职能,也就是说它并不会自动传入任何参数
图片6.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 20:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表