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

Python:实例方法、静态方法和类方法

1.实例方法什么是实例方法—只有实例化对象之后才可以使用的方法,称为类方法;—一般在类中定义的方法,都是类方法;
1. 实例方法
  • 什么是实例方法
    — 只有实例化对象之后才可以使用的方法,称为 类方法;
    — 一般在类中定义的方法,都是 类方法;
    — 该方法的第一个形参接收的一定是对象本身,即 self;
  • 示例:

>>> class Animal():
...     def eat(self):
...         print("animal eat")
...
...
>>> cat = Animal()
>>> cat.eat()
animal eat

— 如上所示,eat() 方法就是实例方法,只有在 cat 对 Animal 类进行实例化之后,eat() 方法才能够被调用;

2. 静态方法
  • 什么是静态方法
    — 类对象或实例对象都可以调用的方法,称为静态方法;
    — 静态方法使用装饰器 @staticmethod进行装饰;
    — 静态方法的参数随意,没有 self 和 cls 参数;
    — 静态方只能能使用 类 属性,不能调用 实例 的任何属性和方法;
  • 静态方法调用
    — 类对象或实例对象都可以调用;
  • 示例:

>>> class Animal():
...     color = "blue"                        # 创建 Animal 类属性 color,并赋值 "blue"    
...     def __init__(self, language):
...         self.language = language
...     @staticmethod
...     def drink(sth):                                               # 静态方法 drink 操作 sth,sth 与 Animal 类没有任何关系
...         print("animal drink {}".format(sth))
...     @staticmethod
...     def has_color():
...         print("animal has {} color".format(Animal.color))         # 静态方法 has_color 调用 Animal 类属性 color
...     @staticmethod
...     def speak():                                                           
...         print("animal speak {}".format(Animal().language))        # 静态方法 speak 调用实例属性 Animal().language
...
>>>
>>> cat = Animal(language="miaomiao")
>>> cat.drink("water")                 # 成功调用 静态方法 drink 操作对象 "water"
animal drink water
>>> cat.has_color()                    # 成功调用 Animal 类属性 color,但是这种操作很鸡肋,因为不可能所有实例的 color 都是 "blue"
animal has blue color
>>> cat.speak()                        # 调用实例属性 Animal().language 失败,这种操作不符合规范
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 13, in speak
TypeError: __init__() missing 1 required positional argument: 'language'

  • 静态方法使用场景
    — 静态方法参数不涉及类内部的变量;
    — 静态方法参数与类没有任何关系;
    — 静态方法不关心类中的属性和方法的变化;
    可以将静态方法当成一个普通的函数使用
3. 类方法
  • 什么是类方法
    — 类方法 使用装饰器@classmethod 进行装饰;
    — 它的第一个参数不是 self,而是 cls,它表示这个类本身;
    — 类方法的第一个参数约定名为 cls;
  • 类方法的调用
    — 和实例方法调用一样,先实例化再调用;

>>> class Animal():
...     def __init__(self, language):               # 初始化参数为 language
...         self.language = language
...     @classmethod                                
...     def speak(cls, language):                   # 创建类方法 speak,其返回的是重新被 cls 即类本身处理过的 cls(language)
...         return cls(language)
...     def __str__(self):                          # 这个__str__是魔法方法,其返回的字符串结果是类默认属性,如果去掉这段代码会报错
...         return "animal speak " + self.language
...
>>> cat = Animal(language="miaomiao")               # 实例化一个 cat,并赋予 language 参数 "miaomiao"
>>>
>>> cat_word = cat.speak(language="wangwang gaga")  # cat 调用了类方法 speak(),并重新赋予 language 参数 "wangwang gaga"
>>> print(cat_word)                                  
animal speak wangwang gaga                          # 打印 cat_word,看看小猫说了什么,神奇的一幕出现了,小猫 wangwang gaga 乱叫

— 在上面的代码中我们发现,尽管我们已经给 cat 实例的 language 参数赋值 “miaomiao”,但是由于 speak() 作为静态方法通过 cls(laguage) 对类进行了二次处理,导致 cat.speak(language=”wangwang gaga”) 的打印结果是 animal speak wangwang gaga,我们得到一个 汪汪嘎嘎 乱叫的 猫。

  • 类方法的应用场景
    — 类方法的一个应用场景,是上面代码中展示的,改变 实例化类 的 __ init __ 初始参数;
    — 类方法的另一个价值是:“类方法让类模板具有记忆力”,具体来说,在普通情况下不使用类方法对类进行实例化,类本身是不具有记忆性的,只是当一个静态模板被套用多次而已。如果我们想让类在每一次实例化之后,都能记载一些记忆,那么就需要用到类方法;
    — 下面的示例展示 类方法如何让类模板具有记忆力

>>> class Count():                           # 创建一个计数器 Cout 类
...     current_count = 10000                # 类变量 current_count 代表类当前的 【数值】,初始值为 10000
...     def __init__(self, num):             # num 参数记录的是当前的 【次数】
...         self.num = num
...         self.current_count = self.count()         
...     @classmethod
...     def count(cls):                      # 此处定义静态方法 count
...         cls.current_count += 1           # 每次调用当前数值都会 +1
...         return cls.current_count
...     def __str__(self):                   # 这个__str__是魔法方法,其返回的字符串结果是类默认属性,如果去掉这段代码会报错
...         return f"第 {self.num} 次计数:当前数值为 {self.current_count}"
...
>>>
>>> num = 0
>>> while num 

推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
author-avatar
银仔-zxy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有