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

大海 · 2020年06月24日 · 1347 次阅读
Python 实例方法、静态方法和类方法详解 (包含区别和用法)
  • 和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法、实例方法和静态方法。
  • 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。
  • 其中 @classmethod@staticmethod 都是函数装饰器。
Python 类实例方法

通常情况下,在类中定义的方法默认都是实例方法。

比如下面的类中就用到了实例方法
class CLanguage:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    # 下面定义了一个say实例方法
    def say(self):
        print("正在调用 say() 实例方法")
实例方法最大的特点就是它最少也要包含一个 self 参数用于绑定调用此方法的实例对象Python 会自动完成绑定)。实例方法通常会用类对象直接调用例如
clang = CLanguage()
clang.say()
运行结果
正在调用 say() 实例方法

当然Python 也支持使用类名调用实例方法但此方式需要手动给 self 参数传值例如
#类名调用实例方法,需手动给 self 参数传值
clang = CLanguage()
CLanguage.say(clang)
运行结果为
正在调用 say() 实例方法

Python 类方法

Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。
和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。

和实例方法最大的不同在于类方法需要使用classmethod修饰符进行修饰例如
class CLanguage:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    #下面定义了一个类方法
    @classmethod
    def info(cls):
        print("正在调用类方法",cls)
注意如果没有 classmethod Python 解释器会将 fly() 方法认定为实例方法而不是类方法

类方法推荐使用类名直接调用当然也可以使用实例对象来调用不推荐)。例如在上面 CLanguage 类的基础上在该类外部添加如下代码
#使用类名直接调用类方法
CLanguage.info()
#使用类对象调用类方法
clang = CLanguage()
clang.info()
运行结果为
正在调用类方法
正在调用类方法

Python 类静态方法

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

静态方法没有类似 selfcls 这样的特殊参数因此 Python 解释器不会对它包含的参数做任何类或对象的绑定也正因为如此类的静态方法中无法调用任何类属性和类方法
静态方法需要使用staticmethod修饰例如
class CLanguage:
    @staticmethod
    def info(name,add):
        print(name,add)
静态方法的调用既可以使用类名也可以使用类对象例如
#使用类名直接调用静态方法
CLanguage.info("C语言中文网","http://c.biancheng.net")
#使用类对象调用静态方法
clang = CLanguage()
clang.info("Python教程","http://c.biancheng.net/python")
运行结果为
C语言中文网 http://c.biancheng.net
Python教程 http://c.biancheng.net/python

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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册