首页 >> 方法大全

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

2022-05-14 方法大全 238 作者:考证青年

和类属性一样,类方法也可以更详细地划分,可以分为类方法、实例方法和静态方法

不同于类属性的分类。对于初学者来说,区分这三种方法很简单,即带有@修饰的方法是类方法;带有@修饰的方法是静态方法;方法,无需对实例方法进行任何修改。

其中@和@是函数装饰器,后续章节会详细介绍。

下面将详细介绍这三种方法。

类实例方法 通常方法,类中定义的方法默认为实例方法。在前面的章节中,我们定义了多个实例方法。不仅如此,类构造器在理论上也是一个实例方法,只是比较特殊。

例如,实例方法用在以下类中:

class CLanguage:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    # 下面定义了一个say实例方法
    def say(self):
        print("正在调用 say() 实例方法")

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

clang = CLanguage()
clang.say()

运行结果:

调用 say() 实例方法

当然,也支持使用类名调用实例方法,但是这种方法需要手动将值传递给self参数。例如:

#类名调用实例方法,需手动给 self 参数传值
clang = CLanguage()
CLanguage.say(clang)

结果是:

调用 say() 实例方法

有关直接使用类名调用实例方法的更多信息方法,请阅读“从类调用实例方法”部分。

类方法类方法与实例方法类似,它也至少包含一个参数,只是在类方法中通常命名为cls,并且会自动将类本身绑定到cls参数(注意绑定不是一个类对象)。也就是说,我们在调用类方法的时候不需要显式地为cls参数传递参数。

和self一样,不指定cls参数的命名(可以随意命名),只是程序员的一种习惯。

与实例方法最大的区别是类方法需要用@修饰符进行修改,例如:

class CLanguage:
    #类构造方法,也属于实例方法
    def __init__(self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    #下面定义了一个类方法
    @classmethod
    def info(cls):
        print("正在调用类方法",cls)

请注意,如果没有@,解释器会将 fly() 方法视为实例方法,而不是类方法。

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

#使用类名直接调用类方法
CLanguage.info()
#使用类对象调用类方法
clang = CLanguage()
clang.info()

结果是:

调用类方法

调用类方法

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

静态方法没有像 self 和 cls 这样的特殊参数,因此解释器不会对其包含的参数进行任何类或对象绑定。因此,任何类属性和类方法都不能从类的静态方法中调用。

静态方法需要用@修改,例如:

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语言中文网站

教程

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

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了