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

news2024/11/15 19:32:06

        在 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 = name
        self.age = age

    def 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:
     @staticmethod
     def 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 = 2

    def 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 = 2

    def info(self, name):
        print(f"name信息:{name}")

cat = Cat()
cat.info("加菲猫")

输出结果: 

name信息:加菲猫

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

class Dog:
    name = "藏獒"
    age = 2

    def 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 = None
    age = None

    def compare_to(self, other):
        # 名字和年龄都一样,就返回True,否则返回False
        return self.name == other.name and self.age == other.age

p1 = Person()
p1.name = "jack"
p1.age = 2

p2 = Person()
p2.name = "tim"
p2.age = 2

print(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.coloradmin.cn/o/1526988.html

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

相关文章

苍穹外卖-day10:Spring Task、订单状态定时处理、来单提醒(WebSocket的应用)、客户催单(WebSocket的应用)

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现:订单状态定时处理、来单提醒和客户催单 订单状态定时处理: 来单提醒: 客户催单: 1. Spring Task 1.1 介绍 Spring Task 是Spring框…

电脑装win11(作si版)

装win11经历 前言:因为我的u盘今天到了,迫不及待试试装机 然后在一系列准备好工具后,便是开始拿学校的机房电脑来试试手了~~ 前期准备 下载好win11镜像(可以去微软官网下载) 下载Rufus工具 https://www.lanzoue.com/…

2023年度VSCode主题推荐(个人常用主题存档)

前言 早在2018年的时候发了一篇关于VSCode主题风格推荐——VS Code 主题风格设置,时过境迁,如今常用的主题皮肤早已更替。 今天下午在整理VSCode插件的时候,不小心把常用的那款(亮色)主题插件给删除了,无…

配置OGG 如何批量修改源端及目标端序列值_满足客户变态需求学会这招你就赚了

欢迎您关注我的公众号【尚雷的驿站】 **************************************************************************** 公众号:尚雷的驿站 CSDN :https://blog.csdn.net/shlei5580 墨天轮:https://www.modb.pro/u/2436 PGFans:ht…

鸿蒙App开发学习 - TypeScript编程语言全面开发教程(下)

现在我们接着上次的内容来学习TypeScript编程语言全面开发教程(下半部分) 4. 泛型 TypeScript 中的泛型(Generics)是一种编程模式,用于在编写代码时增强灵活性和可重用性。泛型使得在定义函数、类、接口等数据类型时…

DeformableAttention的原理解读和源码实现

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 目录 原理第一步看看输入:第二步,准备工作:生成参考点的偏移量生成参考点的权重生成参考点 第三步,工作: 源码 原理 目前流行3D转2DBEV方案的都绕不开的transfomer变体-DeformableAttention. 传统transform…

DataFunSummit 2023因果推断在线峰会:解码数据与因果,引领智能决策新篇章(附大会核心PPT下载)

在数据驱动的时代,因果推断作为数据科学领域的重要分支,正日益受到业界的广泛关注。DataFunSummit 2023年因果推断在线峰会,汇聚了国内外顶尖的因果推断领域专家、学者及业界精英,共同探讨因果推断的最新进展、应用与挑战。本文将…

【小白笔记:JetsonNano学习(一)SDKManager系统烧录】

参考文章:SDKManager系统烧录 小白烧录文件系统可能遇到的问题 担心博主删除文章,可能就找不到比较详细的教程了,特意记录一下。 Jetson Nano采用四核64位ARM CPU和128核集成NVIDIA GPU,可提供472 GFLOPS的计算性能。它还包括4GB…

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

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

海外问卷调查:代理IP使用方法

在进行问卷调查时,为了避免被限制访问或被封禁IP,使用代理IP已经成为了必要的选择。 其中,口子查和渠道查也不例外。 使用代理IP可以隐藏本机IP地址,模拟不同的IP地址,从而规避被封禁的风险。但是,对于很…

登录-前端部分

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

linux 安装常用软件

文件传输工具 sudo yum install –y lrzsz vim编辑器 sudo yum install -y vimDNS 查询 sudo yum install bind-utils用法可以参考文章 《掌握 DNS 查询技巧,dig 命令基本用法》 net-tools包 yum install net-tools -y简单用法: # 查看端口占用情况…

3_springboot_shiro_jwt_多端认证鉴权_Redis缓存管理器

1. 什么是Shiro缓存管理器 上一章节分析完了Realm是怎么运作的,自定义的Realm该如何写,需要注意什么。本章来关注Realm中的一个话题,缓存。再看看 AuthorizingRealm 类继承关系 其中抽象类 CachingRealm ,表示这个Realm是带缓存…

stm32-模拟数字转化器ADC

接线图: #include "stm32f10x.h" // Device header//1: 开启RCC时钟,包括ADC和GPIO的时钟//2:配置GPIO将GPIO配置为模拟输入模式//3:配置多路开关将左边的通道接入到规则组中//4:配置ADC转…

在Python中执行分位数回归

线性回归被定义为根据给定的变量集构建因变量和自变量之间关系的统计方法。在执行线性回归时,我们对计算响应变量的平均值感到好奇。相反,我们可以使用称为分位数回归的机制来计算或估计响应值的分位数(百分位数)值。例如&#xf…

Unity UGUI之Toggle基本了解

在Unity中,Toggle一般用于两种状态之间的切换,通常用于开关或复选框等功能。 它的基本属性如图: 其中, Interactable(可交互):指示Toggle是否可以与用户交互。设置为false时,禁用To…

代码随想录|Day23|回溯03|39.组合总和、40.组合总和II、131.分割回文串

39.组合总和 本题和 216.组合总和III 类似,但有几个区别: 没有元素个数限制:树的深度并不固定,因此递归终止条件有所变化每个元素可以使用多次:下层递归的起始位置和上层相同(startIndex不需要改动&#xf…

#每天一道面试题# 什么是MySQL的回表查询

MySQL中的索引按照物理存储的方式分为聚集索引和非聚集索引; 聚集索引索引和数据存储在一起,B树的叶子节点就是表数据,如果通过聚集索引查询数据,直接就可以查询出我们想要的数据;非聚集索引B树的叶子节点存储的是主键…

Hive SQL必刷练习题:连续问题 间断连续(*****)

问题描述: 1) 连续问题:找出连续三天(或者连续几天的啥啥啥)。 2) 间断连续:统计各用户连续登录最长天数,间断一天也算连续,比如1、3、4、6也算登陆了6天 问题分析&am…

Java八股文(XXL-JOB)

Java八股文のXXL-JOB XXL-JOB XXL-JOB xxl-job 是什么?它的主要作用是什么? xxl-job 是一款分布式任务调度平台,用于解决分布式系统中的定时任务和异步任务调度问题。 它提供了任务的注册、调度、执行和监控等功能,能够帮助开发者…