074、Python 关于实例方法、静态方法和类方法

在Python中,类可以定义三种类型的方法:实例方法、静态方法和类方法。每种方法都有其特定的用途和调用方式。

实例方法(Instance Methods)

  • 定义:实例方法是绑定到类实例上的方法。它们必须有一个名为self的隐式第一个参数,这个参数引用调用该方法的实例。如:

    class MyClass:  def instance_method(self, x):  print(f"Instance method called with {x} and {self}")
    
  • 调用:通过实例来调用实例方法。

  • 访问:实例方法可以访问和修改实例变量,也可以访问类变量(非私有的)。

  • 继承:实例方法可以被继承并在子类中覆盖。子类可以访问和调用父类中的实例方法,也可以定义与父类同名的方法来覆盖父类方法。

  • 用途:实例方法通常用于实现与对象状态相关的行为。

总结:实例方法基本都是面向对象的,即目的就是发送消息给对象。它只能修改实例变量,必须通过对象调用。如下示例就很好体现了它的特征:

class Person:  def __init__(self, name, age):  # 实例变量定义在 __init__ 方法中  self.name = name  self.age = age  # 这是一个实例方法,可以修改实例变量 age  def grow_older(self, years):  self.age += years  print(f"{self.name} is now {self.age} years old.")  # 创建一个 Person 类的实例  
p = Person("Alice", 25)  # 由实例调用实例方法 grow_older ,然后修改实例变量 age  
p.grow_older(3)  # Alice 现在 28 岁了  # 再次打印实例变量 age 的值  
print(p.age)  # 输出: 28

静态方法(Static Methods)

  • 定义:静态方法是与类相关的函数,但它们并不与类或实例状态关联。定义一个静态方法需要用到 @staticmethod 装饰器。
  • 调用:可以通过类名或实例名来调用静态方法。它们没有隐式的第一个参数(如selfcls)。
  • 访问:静态方法不能直接访问实例变量(除非它们作为参数传递),但可以访问类变量(非私有的)。
  • 用途:静态方法通常用于封装与类相关的功能,但这些功能不依赖于类或实例的状态。

总结:定义需使用 @staticmethod 装饰器,没有隐式参数,可通过对象或类调用,适用于无关类或示例状态的方法。如下示例:

class MyClass:  # 使用@staticmethod装饰器定义一个静态方法,它不需要访问实例变量或类变量  @staticmethod  def static_method(arg1, arg2):  # 在这里,可以进行不需要实例或类状态的操作  result = arg1 + arg2  print(f"The result of the operation is: {result}")  # 创建对象
obj = MyClass()# 调用静态方法  
MyClass.static_method(5, 3)  # 不需要创建类的实例调用 
obj.static_method(5, 3)  # 也可以通过实例调用静态方法# 输出: The result of the operation is: 8

类方法(Class Methods)

  • 定义:类方法是绑定到类而不是实例上的方法。需要用到 @classmethod 装饰器。
  • 调用:通过类名或实例对象来调用类方法。无论是通过类名还是实例对象调用类方法,Python都会自动将类本身作为cls参数传入。
  • 访问:类方法无法直接访问实例对象的属性,但可以访问和修改类变量。
  • 可见性和继承:类方法可以被继承并在子类中覆盖。但是,子类无法直接访问父类中的类方法(除非使用super()函数或类名来调用)。
  • 用途:类方法通常用于创建类的实例(工厂方法)、修改类状态或执行与类本身相关的操作,而不是与特定实例相关的操作。

总结:定义需使用 @classmethod 装饰器,需要cls隐式参数,可通过对象或类调用,适用于执行与类本身相关的操作。如下示例:

class MyClass:  # 定义一个类变量,属于类本身,所有的实例共享这个变量  class_variable = "I'm a class variable"  # 定义一个类方法,它使用 @classmethod 装饰器  @classmethod  def class_method(cls, arg):  # 类方法的第一个参数是 cls,它引用类本身  print(f"This is a class method of {cls.__name__}")  # 可以通过 cls 访问类变量  print(f"Class variable: {cls.class_variable}")  # 可以在这里执行与类本身相关的操作  print(f"Argument passed to class method: {arg}")  # 创建对象
obj = MyClass()# 调用类方法  
MyClass.class_method("Hello from class method")  # 不需要创建类的实例调用  
obj.class_method("Hello from class method")  # 也可以通过实例调用# 输出:  
# This is a class method of MyClass  
# Class variable: I'm a class variable  
# Argument passed to class method: Hello from class method

以上即为类中常定义的三种类型的方法,只要充分理解它们的作用与区别,就能让我们更灵活的进行对象编程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 1.22特性之for loop

背景 go1.22版本 for loop每轮循环都生成新的变量. 原谅: https://tip.golang.org/doc/go1.22 Previously, the variables declared by a “for” loop were created once and updated by each iteration. In Go 1.22, each iteration of the loop creates new variables, to …

【C++11】自己封装RAII类,有哪些坑点?带你了解移动语义的真相

文章目录 一、持有资源的类定义移动构造函数的要点1.普通内置类型与std::move2.常见的容器与std::move3.结构体:4.智能指针与std::move 参考 一、持有资源的类定义移动构造函数的要点 1.普通内置类型与std::move 在C中,std::move 主要用于对象的移动语…

Wireshark - tshark支持iptables提供数据包

tshark现在的数据包获取方式有两种,分别是读文件、网口监听(af-packet原始套接字)。两种方式在包获取上,都是通过读文件的形式;存在文件io操作,在专门处理大流量的情境下, 我们复用wireshark去做…

Windows编程上

Windows编程[上] 一、Windows API1.控制台大小设置1.1 GetStdHandle1.2 SetConsoleWindowInfo1.3 SetConsoleScreenBufferSize1.4 SetConsoleTitle1.5 封装为Innks 2.控制台字体设置以及光标调整2.1 GetConsoleCursorInfo2.2 SetConsoleCursorPosition2.3 GetCurrentConsoleFon…

python如何输出list

直接输出list_a中的元素三种方法: list_a [1,2,3,313,1] 第一种 for i in range(len(list_a)):print(list_a[i]) 1 2 3 313 1 第二种 for i in list_a:print(i) 1 2 3 313 1 第三种,使用enumerate输出list_a方法: for i,j in enum…

Redis的使用(二)redis的命令总结

1.概述 这一小节,我们主要来研究一下redis的五大类型的基本使用,数据类型如下: redis我们接下来看一看这八种类型的基本使用。我们可以在redis的官网查询这些命令:Commands | Docs,同时我们也可以用help 数据类型查看命令的帮助文档。 2. 常…

数据结构 - C/C++ - 串

字符处理 C 特性 C语言中字符串存储在字符数组中,以空字符\0结束。 字符串常量,const char* str "Hello",存储在只读的数据段中。 布局 字符串在内存中是字符连续存储的集合,最后一个字符为空字符(ASCII值为0)&…

opencascade AIS_InteractiveContext源码学习7 debug visualization

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

【问题已解决】Vue管理后台,点击登录按钮,会发起两次网络请求(竟然是vscode Compile Hero编译插件导致的)

问题 VueElement UI 做的管理后台,点击登录按钮,发现 接口会连续掉两次,发起两次网络请求,但其他接口都是正常调用的,没有这个问题,并且登录按钮也加了loading,防止重复点击,于是开…

搜索引擎常用语法

引号 (" "): 用双引号将词组括起来,搜索引擎将返回包含完全相同短语的结果。 示例:"人工智能发展趋势" 减号 (-): 在关键词前加上减号可以排除包含特定词语的结果。 示例:人工智能 -机器学习(排除包含 “机器…

朴素贝叶斯解密:sklearn中的分类器工作原理

📚 朴素贝叶斯解密:sklearn中的分类器工作原理 在机器学习领域,朴素贝叶斯分类器因其简单、高效而广受欢迎。特别是在处理大量特征数据时,朴素贝叶斯表现出了卓越的性能。scikit-learn(简称sklearn)是Pyth…

JavaMySQL 学习(基础)

目录 Java CMD Java发展 计算机存储规则 Java学习 switch新用法(可以当做if来使用) 数组定义 随机数 Java内存分配 MySQL MySQL概述 启动和停止 客户端连接 数据模型 关系型数据库 SQL SQL通用语法 SQL分类 DDL--数据定义语言 数据库…

浏览器开发者工具辅助爬虫开发

文章目录 浏览器开发者工具辅助爬虫开发打开开发者工具使用Network面板分析请求数据示例步骤: 使用Elements面板查看和修改DOM结构示例步骤: 使用Console面板调试JavaScript代码示例步骤:示例代码:1. 输出日志信息2. 输出对象信息…

Vue 与 React 区别

Vue.js和React是现代Web开发中两种非常流行的前端框架,两者在**核心概念、组件以及生态系统扩展性**等方面存在区别。具体分析如下: 1. **核心概念** - **Vue**:Vue是一个渐进式JavaScript框架,它致力于视图层,易于上手…

左值右值, 左值引用右值引用,完美转发

一. 左值和右值 左值: 可以取地址的对象 右值: 不可以取地址的对象 double x1.0, y 2.0; 1; // 字面量, 不可取地址, 是右值 x y; // 表达式返回值, 不可取地址, 是右值 max(x, y); // 传值返回函数的返回值 (非引用返回)总结就是: 根据是否可以取地址来区分是左值还…

线程池666666

1. 作用 线程池内部维护了多个工作线程,每个工作线程都会去任务队列中拿取任务并执行,当执行完一个任务后不是马上销毁,而是继续保留执行其它任务。显然,线程池提高了多线程的复用率,减少了创建和销毁线程的时间。 2…

git修改已提交的commit注释

在Git中修改已经提交的commit注释通常有以下几种情况和相应的方法: 1. 修改最后一次提交的注释(快速修正) 如果你想要修改的是最后一次提交的注释,可以使用 --amend 选项: git commit --amend这个命令会将你的暂存区…

基于深度学习的光度检测

基于深度学习的光度检测(Photometric Detection)涉及从图像中检测和分析光照信息,用于多种应用,如场景理解、照明调节、增强现实(AR)、图像增强等。以下是关于这一领域的系统介绍: 1. 任务和目…

JAVA基础教程DAY1-类与方法及形参实参

首先经过C语言的学习,我们已经学会了基本的编程方法,我们知道C语言是面向过程的编程语言,而JAVA是面向对象的编程语言,所以接下来我们通过对比和举例来进行JAVA语言的学习 首先我们来讲类的概念 类:类是一个模板&…

Ubuntu开通5005端口 记录

Ubuntu版本:20.04 使用systemctl status firewalld查看防火墙状态,报错Unit firewalld.service could not be found 报错的原因是没有安装firewall,安装命令为sudo apt install firewalld,然后进行安装 安装完成后输入systemctl…