page contents

Python实例方法、静态方法和类方法详解(包含区别和用法)

和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法、实例方法和静态方法。

和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法实例方法静态方法。

和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。

其中 @classmethod 和 @staticmethod 都是函数装饰器。

接下来就给大家详细的介绍这 3 种类方法。

Python类实例方法

通常情况下,在类中定义的方法默认都是实例方法。我们已经定义了不只一个实例方法。不仅如此,类的构造方法理论上也属于实例方法,只不过它比较特殊。

比如,下面的类中就用到了实例方法:

  1. class CLanguage:

  2. #类构造方法,也属于实例方法

  3. def __init__(self):

  4. self.name = "C语言中文网"

  5. self.add = "http://c.biancheng.net"

  6. # 下面定义了一个say实例方法

  7. def say(self):

  8. print("正在调用 say() 实例方法")

实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用,例如:

  1. clang = CLanguage()

  2. clang.say()

运行结果:

正在调用 say() 实例方法

当然,Python 也支持使用类名调用实例方法,但此方式需要手动给 self 参数传值。例如:

  1. #类名调用实例方法,需手动给 self 参数传值

  2. clang = CLanguage()

  3. CLanguage.say(clang)

运行结果为:

正在调用 say() 实例方法

Python类方法

Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。

和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。

和实例方法最大的不同在于,类方法需要使用@classmethod修饰符进行修饰。

注意,如果没有 @classmethod,则 Python 解释器会将 fly() 方法认定为实例方法,而不是类方法。

类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。例如,在上面 CLanguage 类的基础上,在该类外部添加如下代码:

  1. #使用类名直接调用类方法

  2. CLanguage.info()

  3. #使用类对象调用类方法

  4. clang = CLanguage()

  5. clang.info()

运行结果为:

正在调用类方法 <class '__main__.CLanguage'>
正在调用类方法 <class '__main__.CLanguage'>

Python类静态方法

静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。

静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。

静态方法需要使用@staticmethod修饰,例如:

  1. class CLanguage:

  2. @staticmethod

  3. def info(name,add):

  4. print(name,add)

静态方法的调用,既可以使用类名,也可以使用类对象
在实际编程中,几乎不会用到类方法和静态方法,因为我们完全可以使用函数代替它们实现想要的功能,但在一些特殊的场景中(例如工厂模式中),使用类方法和静态方法也是很不错的选择。

attachments-2021-05-7nnL75476093afe4875b6.jpg

  • 发表于 2021-05-06 17:00
  • 阅读 ( 668 )
  • 分类:Python开发

0 条评论

请先 登录 后评论
小柒
小柒

1474 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章