热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python的类方法、静态方法、实例方法_Python学习06.07:Python实例方法、静态方法和类方法详解(包含区别和用法)...

接下来就给大家详细的介绍这3种类方法。通常情况下,在类中定义的函数默认都是实例函数。前面章节中,我们已经定义了不只一个函数方法。不仅如此,

19.jpg

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

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

比如,下面的类中就用到了实例函数:

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类函数

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类静态函数

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

静态函数没有类似 self、cls 这样的特殊参数,因此 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

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



推荐阅读
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 一篇关于五个编程问题的 Reddit 帖子引发了广泛讨论,特别是关于这些题目是否适合所有软件工程师。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • C语言中fprintf函数写入文件出现空白问题及解决方法
    C语言中fprintf函数写入文件出现空白问题及解决方法 ... [详细]
  • 在Python 2.7环境中使用PyCharm进行Cvxopt的安装及线性规划问题求解。具体步骤包括:通过PyCharm的文件菜单进入项目设置,选择解释器选项,点击右侧的“+”按钮,在可用包列表中搜索并安装Cvxopt。安装完成后,可以通过导入Cvxopt库并调用其函数来解决线性规划问题,提高模型的准确性和效率。 ... [详细]
  • 在Python中,可以通过导入 `this` 模块来优雅地展示“Python之禅”这一编程哲学。该模块会将这些指导原则以一种美观的方式输出到控制台。为了增加趣味性,可以考虑在代码中对输出内容进行简单的加密或混淆处理,以提升用户体验。 ... [详细]
  • Python,英国发音:ˈpaɪθən,美国发音:ˈpaɪθ��ːn,空耳读法为“ ... [详细]
author-avatar
beitianmolang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有