实例方法,静态方法和类方法详解
实例方法,静态方法和类方法详解
和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法、实例方法和静态方法。
和类属性的分类不同,对于初学者来说, 区分这3中类方法是非常简单的,即采用@classmethod 修饰的方法为类方法,采用@staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法
其中@classmethod 和@staticmethod 都是函数装饰器
类实例方法
通常情况下,再类中定义的方法默认都是实例方法。
类的构造方法理论上也属于实例方法,只不过它比较特殊。
下面的类中就用到了实例方法:
class Wei: # 类构造方法,也属于实例方法 def __init(self): self.name = '帅哥' self.add = "http://c.biancheng.net" # 下面定义了一个say实例方法 def say(self): print("正在调用say() 实例方法")
实例方法最大的特点就是,它最少也要包含一个self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用,例如:
shuaige = Wei() shuaige.say()
运行结果:
正在调用say() 实例方法
当然,Python也支持使用类名调用实例方法,但此方法需要手动给 self 参数传值,例如:
# 类名调用实例方法,需要手动给 self 参数传值 shuaige = Wei() Wei.say(shuaige)
运行结果:
正在调用 say() 实例方法
类方法
类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python会自动将类本身绑定给cls参数(注意,绑定的不是类对象)。 也就是说,我们在调用类方法时,无需显示为 cls 参数传参。
和 self一样,cls参数的命名也不是规定的(可以随意命名),知识Python程序员约定俗称的习惯而已
和实例方法最大的不同在于,类方法需要使用@classmethod 修饰符进行修饰,例如:
class Wei: # 类构造方法,也属于实例方法 def __init(self): self.name = '帅哥' self.add = "http://c.biancheng.net" # 下面定义了一个类实例方法 @classmethod def info(cls): print("正在调用类方法",cls)
注意,如果没有 @classmethod,则 Python 解释器会将 info() 方法认定为实例方法,而不是类方法。
类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。例如,在Wei类的基础上,在该类外部添加如下代码:
# 使用类名直接调用类方法 Wei.info() # 使用类对象调用类方法 shuaige = Wei() shuaige.info()
运行结果:
正在调用类方法 <class '__main__.CLanguage'> 正在调用类方法 <class '__main__.CLanguage'>
类静态方法
静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在这空间 (类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。
静态方法没有类似 self、cls 这样的特殊参数,因此Python解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。
静态方法需要使用 @staticmethod 修饰,例如:
class Wei: @staticmethod def info(name,add) print(name,add)
静态方法的调用,既可以使用类名,也可以使用类对象,例如:
# 使用类名直接调用静态方法 Wei.info("C语言中文网","http://c.biancheng.net") # 使用类对象调用静态方法 shuaige = Wei() shuaige.info("Python教程","http://c.biancheng.net/python")
运行结果为:
C语言中文网 http://c.biancheng.net Python教程 http://c.biancheng.net/python
在实际编程中,几乎不会用到类方法和静态方法,因为我们完全可以使用函数代替它们实现想要的功能,但在一些特殊的场景中(例如工厂模式),使用类方法和静态方法也是很不错的喧杂
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)