Python--成员方法、@staticmethod将成员方法静态化、self参数释义

        在 Python 中,成员方法是指定义在类中的函数,用于操作类的实例对象。成员方法通过第一个参数通常命名为 self,用来表示调用该方法的实例对象本身。通过成员方法,可以实现类的行为和功能。

成员方法的定义
        在类中定义成员方法和定义函数基本一样(原理和运行机制一样),但还是有点不同(形式上有不同)
基本语法:

def 方法名(self,形参列表):方法体

注意:

  1. 在方法定义的参数列表中,有一个self
  2. self是定义成员方法时需要写上的(若不需要self这个参数,可以使用@staticmethod方法使得成员方法变为静态方法)
  3. self表示当前对象本身( 简单地说,哪个对象调用,self就代表哪个对象 )
  4. 当我们通过对象调用方法时,self会隐式的传入
  5. 在方法内部,需要使用self,才能访问到成员变量

  举例:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef display_info(self):print(f"Name: {self.name}, Age: {self.age}")# 创建 Person 类的实例对象
person1 = Person("Alice", 30)# 调用成员方法 display_info
person1.display_info()

在上面的代码中,display_info 是 Person 类的一个成员方法,用来显示该类的实例对象的信息。通过 person1.display_info() 调用该方法,输出该实例对象的姓名和年龄信息。

@staticmethod 方法的使用


        将方法转换为静态方法,静态方法不会接收隐式的第一个参数。要声明一个静态方法,请使用此语法。

  class C:@staticmethoddef f(arg1, arg2, argN):....

 @staticmethod这样的形式称为函数的decorator。
        静态方法既可以由类中调用( 如C.f( ) ),也可以由实例中调用( 如C(),f() )。此外,还可以作为普通的函数进行调用(如 f() )。

        像所有装饰器一样,也可以像常规函数一样调用staticmethod,并对其结果执行某些操作。比如某些情况下需要从类主体引用函数并且您希望避免自动转换为实例方法。对于这些情况,请使用此语法:

def regular_function():...
class C:method = staticmethod(regular_function)

举例:

class Dog:name = "藏獒"age = 2# 普通方法def info(self, name):print(f"name信息->{name}")# 静态方法@staticmethod# 通过@staticmethod可以将方法转为静态方法# 如果是一个静态方法,可以不带self参数# 静态方法调用形式有变化def ok():print("ok()...")dog = Dog() # 实例化
dog.info("德牧")# 调用静态方法
# 方式1:通过对象调用
dog.ok()
# 方式2:通过类名调用
Dog.ok()

运行结果: 

name信息->德牧
ok()...
ok()...

        创建一个Dog类,该类中有一个普通方法 info(self, name) ,一个静态方法 ok(),如果我们将@staticmethod这行注释掉,那么静态方法ok() 就会报错,给出错误原因是,该方法必须有第一个参数,通常被叫做为self。

        如果我们不希望有这个self参数,那我们将@staticmethod这行加上即可。

self参数释义 

       3. self表示当前对象本身( 简单地说,哪个对象调用,self就代表哪个对象 ) 

class Dog:name = "藏獒"age = 2def hi(self):print(f"hi self:{id(self)}")# self表示当前对象本身
# 创建对象dog2
dog2 = Dog()
print(f"dog2:{id(dog2)}")
dog2.hi()# 创建对象dog3
dog3 = Dog()
print(f"dog3:{id(dog3)}")
dog3.hi()

运行结果: 

dog2:1727907491208
hi self:1727907491208
dog3:1727907491400
hi self:1727907491400

注:输出结果不唯一。

举一个通俗易懂的例子来说明self表示当前对象本身这句话:
        假设有三个人,张三、李四和王五,他们三个人都说了同一句话,这句话的内容是,我的爸爸,当张三说这句话的时候,则 “我的” 指的是张三,当李四说这句话的时候,则 “我的” 指的是李四,当王五说这句话的时候,则 “我的” 指的是王五。
        在上面这个例子中,张三、李四、王五可以看作是由类实例化出来的对象,而 “我的 可以看作是self参数。

5. 在成员方法内部,需要使用self,才能访问到成员变量和成员方法 

 先看一段代码,并分析输出的信息是什么?

class Cat:name = "波斯猫"age = 2def info(self, name):print(f"name信息:{name}")cat = Cat()
cat.info("加菲猫")

输出结果: 

name信息:加菲猫

问题分析:如果我们希望在成员方法内部,访问对象的属性/成员变量,怎么办?
答案:使用self

class Dog:name = "藏獒"age = 2def eat(self):print(f"{self.name}饿了...")def cry(self, name):print(f"{name} is crying")print(f"{self.name} is crying")self.eat()# eat() # 不能直接调用dog = Dog()
dog.cry("金毛")

输出结果:

金毛 is crying
藏獒 is crying
藏獒饿了...

练习题

        定义Person类,里面有name、age属性,并提供compare_to 比较方法,用于判断是否和另一个人相等,名字和年龄都一样,就返回True,否则返回False。

代码如下:

class Person:name = Noneage = Nonedef compare_to(self, other):# 名字和年龄都一样,就返回True,否则返回Falsereturn self.name == other.name and self.age == other.agep1 = Person()
p1.name = "jack"
p1.age = 2p2 = Person()
p2.name = "tim"
p2.age = 2print(p1.compare_to(p2)) # False

        我们创建了一个Person类,该类中有两个属性(成员变量)和一个方法(成员方法),两个属性分别为name 、age,一个方法为compare_to。
        随后实例化两个对象p1、p2,p1的name属性为 “jack” ,age属性为2,p2的name属性为“tim”,age属性为2。
        最后p1调用成员方法compare_to,传入的参数为self 和p2对象,由于self参数可以隐式传入,故只需写p2即可。

由于p1的name属性为jack,p2的name属性为tim,两者不相等,故程序最终输出False。若将p1的name属性改为tim或将p2的name属性改为jack,那么程序会输出True。

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

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

相关文章

【Linux】Linux上代码的编译与调试

目录 Linux上常用的编译器gcc\g 如何使用gcc/g 编译过程: 如何使用gcc编译? 进行预处理 进行编译 进行汇编 进行链接 函数库 函数库的分类 gcc选项 Linux调试器-gdb的使用 gdb的常用参数 Linux项目自动化构建工具make/Makefile 原理 利用…

MYSQL日志 redo_log更新流程 bin_log以及bin_log数据恢复

Redo_log写入策略 Redo log的Innodb_flush_log_at_trx_commit:: 这个参数有三个取值 取值为0:每次事务提交时,只是把redo_log留在 redo log buffer中,宕机会丢失数据; 取值为1(默认值):每次事…

1.中医学习-总论

目录 1.为什么要学中医 2.什么是中医 介绍 中医例子1: 中医例子2: 中医最高境界“大道至简” 中医讲究的是本质 中医核心:阴阳、表里、寒热、虚实 ​编辑医不叩门 3.阴阳 1.一天中的阴阳 2.一年中的阴阳 3.阴阳之间的关系 4.阴阳四季的变化 …

解决:visio导出公式为pdf图片乱码问题

今天需要将Visio编辑好的以后的图输出pdf,但是点击保存后公式部分一直乱码,如下图所示 保存为pdf后会变成: 解决方案:保存时点击文件下方的快速打印,存到桌面,不要直接点击保存

代码随想录算法训练营第二十五天|216.组合总和III,17.电话号码的字母组合

216.组合总和III 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 示例 2: 输入…

24计算机考研调剂 | 【官方】山东师范大学(22自命题)

山东师范大学2024年拟接收调剂 考研调剂信息 调剂专业目录如下: 计算机技术(085404)、软件工程(085405) 补充内容 我校2024年硕士研究生调剂工作将于4月8日教育部“中国研究生招生信息网”(https://yz.ch…

深入了解JVM底层原理

一、JVM内存结构 1、方法区:存储编译后的类、常量等(.class字节码文件) 2、堆内存:存储对象 3、程序计数器:存储当前执行的指令地址(计算机处理器(CPU)正在执行的下一条指令在内存…

openwrt下部署clouddrive2

在启动项上增加启动参数 在exit 0前面增加 mount --make-shared /mnt/data480g注意,后面的/mnt/data480g要替换成你设置的共享映射券。 拉取镜像 docker pull cloudnas/clouddrive2启动镜像 一定要用ssh在后台用docker run命令启动,因为openwrt前台…

函数-Python

师从黑马程序员 函数初体验 str1"asdf" str2"qewrew" str3"rtyuio" def my_len(data):count0for i in data:count1print(f"字符串{data}的长度是{count}")my_len(str1) my_len(str2) my_len(str3) 函数的定义 函数的调用 函数名&a…

基于Java的大学计算机课程管理平台(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

面试笔记——Redis(缓存击穿、缓存雪崩)

缓存击穿 缓存击穿(Cache Breakdown): 当某个缓存键的缓存失效时(如,过期时间),同时有大量的请求到达,并且这些请求都需要获取相同的数据,这些请求会同时绕过缓存系统&a…

【GameFramework框架内置模块】8、文件系统(File System)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q7…

登录-前端部分

登录表单和注册表单在同一个页面中,通过注册按钮以及返回按钮来控制要显示哪个表单 一、数据绑定和校验 (1)绑定数据,复用注册表单的数据模型: //控制注册与登录表单的显示, 默认false显示登录 true时显…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明: field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

java方法的引用传递和值传递

1、方法的值参数传递 下面代码,它会在控制台输出什么? public class ArrayTest {public static void main(String[] args) {int number 100;System.out.println(number);change(number);System.out.println(number);}public static void change(int n…

vue3使用qrcodejs2-fix生成背景透明的二维码

qrcodejs官方仓库:GitHub - davidshimjs/qrcodejs: Cross-browser QRCode generator for javascript qrcodejs2-fix 是一个用于生成QR码的JavaScript库,使用的时候先安装,然后通过设置前景色和背景色可以控制显示的二维码效果。想生成透明背…

手撕算法-二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数 0≤_n_≤1000 , 二叉树每个节点的值 0≤_val_≤1000要求: 空间复杂度 O(n) 。本题也有原地操作,即空间复杂度 O(1) 的解法&#xff0c…

士兵排列问题

解法一&#xff1a; deque实现队头入队和队尾入队即可得到编号排列&#xff0c;每个士兵有二个属性&#xff1a;编号、能力值。 #include<iostream> #include<algorithm> #include<deque> #include<vector> using namespace std; #define endl \n st…

汇率与政治的关系?Anzo Capital实例举证

投资者在使用特定货币对交易时&#xff0c;交易者应关注交易所用货币国家的主要政治新闻。众所周知&#xff0c;政治和金融密切相关&#xff0c;因此重要政治消息的发布会对汇率产生强烈影响。 Anzo Capital实例举证&#xff1a;汇率与政治的关系。 其中一个例子&#xff0c…

文件系统 与 软硬链接

目录 一、文件系统 认识磁盘 磁盘存储的逻辑抽象结构 块组的内容 inode Table Data blocks inode Bitmap Block Bitmap Group Descriptor Table Super Block 理解目录 二、软硬链接 软链接​ 硬链接 硬链接数 一、文件系统 之前的博客主题叫做"进程打开文…