当前位置: 首页 > news >正文

Python - 面向对象编程 - 实例方法、静态方法、类方法

实例方法

在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法

实例方法栗子

class PoloBlog:def __init__(self, name, age):print("自动调用构造方法")self.name = nameself.age = agedef test(self):print("一个实例方法,需要通过对象调用")print("my name is :", self.name, " and my age is :", self.age)blog = PoloBlog("小菠萝", 24)
blog.test()# 输出结果
自动调用构造方法
一个实例方法,需要通过对象调用
my name is : 小菠萝  and my age is : 24 

  • 最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)
  • 实例方法通常会用实例对象直接调用

通过类名调用实例方法

Python 也支持通过类名调用实例方法,但需要手动给 self 参数传实例对象

blog = PoloBlog("小菠萝", 24)PoloBlog.test(blog)# 输出结果
自动调用构造方法
一个实例方法,需要通过对象调用
my name is : 小菠萝  and my age is : 24

假设不传实例对象,pycharm 会有warning

类方法

类方法和实例方法很相似,又很不相似

相似点

  • 也至少要包含一个参数,不过通常命名为 cls
  • 在调用类方法时,无需显式为 cls 参数传参,但传递的并不是实例对象,而是类对象本身

不同点

最大的不同在于需要使用 @classmethod 装饰器才能称为类方法

实际栗子

class PoloBlog:# 类属性sum = 0# 类方法, 添加装饰器@classmethoddef class_func(cls):print("class_func cls 对象的 id ", id(cls))cls.sum += 1print("类属性 sum ", cls.sum)@classmethoddef class_func_twi(cls):print("class_func_twi cls 对象的 id ", id(cls))cls.sum += 1print("类属性 sum ", cls.sum)PoloBlog.class_func()
PoloBlog.class_func_twi()# 输出结果
class_func cls 对象的 id  140583542774880
类属性 sum  1
class_func_twi cls 对象的 id  140583542774880
类属性 sum  2 

cls 代表的是同一个对象,类对象

类方法可以调用实例方法吗?

可以,但有局限性

class PoloBlog:# 类属性sum = 0def __init__(self, sum):self.sum = sum# 实例方法def test(self):print("self id is ",id(self))print("self 对象的 sum 属性值为:", self.sum)# 类方法, 添加装饰器@classmethoddef class_func(cls):print("cls id is ", id(cls))print("类属性 sum ", cls.sum)# 调用实例方法cls.test(cls)PoloBlog.class_func()# 输出结果
cls id is  140500501817184
类属性 sum  0
self id is  140500501817184
self 对象的 sum 属性值为: 0

  • 类方法调用实例方法的方式: ,通过 cls 调用,且还要传递 cls 为参数

cls.实例方法(cls)

  • 从 id 相同即可看出,实例方法接收的仍然是一个类对象

实例对象可以调用类方法吗?

可以,但不建议

blog = PoloBlog(2)
blog.class_func()# 输出结果
cls id is  140500501817184
类属性 sum  0
self id is  140500501817184
self 对象的 sum 属性值为: 0 

  • blog 是一个实例对象,且初始化赋值了 sum 实例属性
  • 但最后实例方法打印的仍然是 sum 类属性,表明类方法无法访问实例属性
  • 且 cls、self 参数的 id 和上面的栗子完全一样,表明即使通过实例对象调用类方法,传递的仍然是类对象的引用,所有类方法都被同一个类对象调用,一个类只有一个类对象

实例方法可以调用类属性吗?

可以,但不能通过实例对象调用,只能通过类对象

class PoloBlog:# 类属性name = "类啊类属性"def __init__(self, name):self.name = name# 实例方法def test(self):# 错误栗子# print(name)# 访问的仍然是实例属性print(self.name)# 通过类名访问print(PoloBlog.name)blog = PoloBlog("小菠萝")
blog.test()# 输出结果
小菠萝
类啊类属性

假设直接调用 name 变量可以吗

肯定不行,报错

扩展思考题!

  • 一个方法内部既需要访问实例属性,又需要访问类属性,应该定义为什么方法?
  • 答案:实例方法,因为可以通过 来访问,但在类方法中无法访问实例属性

类对象.类属性

代码栗子直接看上面一个就是啦!

静态方法

  • 和之前学过的函数一毛一样,唯一区别是:静态方法需要定义在类体中,且需要添加 装饰器

@staticmethod

  • 静态方法没有 self、cls 参数,也不需要至少传一个参数,和普通函数一样
  • Python 解释器不会对它包含的参数做任何类或对象的绑定,所以静态方法无法调用任何类属性、类方法、实例属性、实例方法,除非通过类名和实例对象

什么时候会用静态方法

类里面封装的方法

  • 既不需要访问实例属性、实例方法
  • 也不需要访问类属性、类方法

就可以考虑将这个方法封装成一个静态方法

实际栗子

class PoloBlog:# 静态方法@staticmethoddef info(name, age):print(name, age)# 通过类对象调用
PoloBlog.info("小菠萝111", 24)blog = PoloBlog()
# 通过实例对象调用
blog.info("小菠萝222", 14)# 输出结果      
小菠萝111 24
小菠萝222 14

关于实例方法、 classmethod 和 staticmethod 的实际应用场景

简单来说

  • 实例方法:方法内部需要访问实例属性、实例方法就定义为实例方法;既需要访问实例属性、方法,也需要访问类属性、方法,那必须定义为实例方法
  • 类方法:方法内部只需要访问类属性、类方法就定义为类方法
  • 静态方法:方法内部既不需要访问实例属性、实例方法,也不需要访问类属性、类方法就定义为静态方法

相关文章:

Python - 面向对象编程 - 实例方法、静态方法、类方法

实例方法 在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog:def __init__(self, name, age):print("自动调用构造方法")self.name nameself.age agedef test(self):print("一个实例方法&…...

性能测试——基本性能监控系统使用

这里写目录标题 一、基本性能监控系统组成二、环境搭建1、准备数据文件 type.db collectd.conf2、启动InfluxDB3、启动grafana4、启动collectd5、Grafana中配置数据源 一、基本性能监控系统组成 Collectd InfluxdDB Grafana Collectd 是一个守护(daemon)进程,用来…...

JavaCollection集合

5 Collection集合 5.1 Collection集合概述 是单列集合的顶层接口,它表示一组对象,这些对象也称Collection元素JDK不提供此接口的直接实现,它提供更具体的子接口(Set 和 List)实现package ceshi;import java.util.AbstractCollection; import java.util.ArrayList; import…...

C++中string的用法

博主简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的人。 博主主页:陈童学哦 所属专栏:CSTL 前言:Hello各位小伙伴们好!欢迎来到本专栏CSTL的学习,本专栏旨在帮助大家了解…...

目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用

目录 基于深度学习的交通目标检测算法研究 传统的目标检测算法 基于深度学习的目标检测算法 </...

面试:vue事件绑定修饰符

stop - 调用 event.stopPropagation()。 prevent - 调用 event.preventDefault()。 trim 自动过滤用户输入的首尾空格 number 将输出字符串转为Number类型 enter 回车键 capture - 添加事件侦听器时使用 capture 模式。 self - 只当事件是从侦听器绑定的元素本身触发时才触发…...

优思学院|从0到1,认识精益生产管理

精益生产是一种系统性的生产管理方法&#xff0c;旨在最大化价值&#xff0c;最小化浪费&#xff0c;以及提高产品质量和客户满意度。它源于丰田生产系统&#xff08;TPS&#xff09;&#xff0c;是一种基于流程优化、以人为本的管理方法&#xff0c;强调优化生产流程、减少浪费…...

HashSet创建String类型的数据

package com.test.Test07;import java.util.HashSet;public class TestString {//这是一个main方法&#xff0c;是程序的入口public static void main(String[] args) {//创建一个HashSet集合HashSet<String> hs new HashSet<>();hs.add("hello");Syste…...

真会玩:莫言用ChatGPT为余华写了一篇获奖词

5月16日&#xff0c;《收获》杂志65周年庆典暨新书发布活动在上海舞蹈中心举行。 典礼现场&#xff0c;余华凭借《文城》获得收获文学榜2021年长篇小说榜榜首。 作为老友&#xff0c;莫言在颁奖时故意卖了个关子&#xff1a;“这次获奖的是一个了不起的人物&#xff0c;当然了&…...

10 工具Bootchart的使用(windows)

Bootchart的使用方法&#xff08;windows&#xff09; 下载bootchart.jar并拷贝到windows, 然后保证windows也安装了open jdk 1.8; 下载地址&#xff1a;https://download.csdn.net/download/Johnny2004/87807973 打开设备开机启动bootchart的开关: adb shell touch /data/boo…...

电磁频谱异常监测论文阅读 | 《战场电磁环境下的电磁频谱管控指标体系研究》

文章目录 1.《战场电磁环境下的电磁频谱管控指标体系研究》1.1 电磁频谱管控的基本概念:1.2 电磁频谱管控的主要内容:1.3 指标体系1.3.1 技术指标体系1.3.2 战术指标体系1.《战场电磁环境下的电磁频谱管控指标体系研究》 1.1 电磁频谱管控的基本概念: 频谱管控是指军队领导…...

掌握好linkedin的这些技巧,你就已经超越了80%的跨境人

领英作为一款目前市面上最多人使用的在线职场社交媒体软件&#xff0c;是我们这些跨境电商人拓展客户的好渠道&#xff0c;并且很容易找到相应的外贸客户。但是领英的玩法并不像其他社交媒体平台一样简单&#xff0c;规则比较多&#xff0c;很多国内的用户都是胡乱操作&#xf…...

Linux——网络套接字1|socket编程

IP地址(公网IP),标定了主机的唯一性。 通常情况,把数据送到对方的机器是目的吗? 不是的,真正的网络通信过程其实是进程间通信,如客户端进程和服务器进程,我们把数据在主机间转发仅仅是手段,机器收到数据之后,需要将数据交付给指定的进程,当客户端有多个进程在运行时…...

stable-diffusion-webui服务器centos部署实践(成功)

之前关注stable-diffusion仅仅是因为stable-diffusion模型,但实践证明,stable-diffusion如果么有那么好的提示词功力,恐怕生成的图就是“畸形的,缺胳膊少腿的,多一块,少一块的”,如V1实践,V2实践,纸糊效果。 如果做不到其他人那样“美女自给自足”,那么我这个“大佬…...

北京筑龙作为软件服务商出席《国企阳光采购标准》研讨会

近日&#xff0c;由中国企业国有产权交易机构协会市场创新专业委员会主办、青岛产权交易所有限公司承办的《国企阳光采购标准》研讨会在青岛召开&#xff0c;该会议共有19家已开展采购业务的各地产权交易机构参加&#xff0c;北京筑龙作为软件服务商出席会议。 《国企阳光采购标…...

如何动态显示物品提示?

UE5 插件开发指南 前言0 提示信息窗口类前言 为了使物品的排列简洁,各种游戏里的物品信息都是以提示的形式展示出来,而不是整个铺排陈列,只需要玩家鼠标悬停在物品上就自动显示出提示窗口,如下图所示: 这些提示信息在物品定义数据资产中已经定义了,所以这里要做的只是将…...

推荐试试这个简单好用的手机技巧

技巧一&#xff1a;一键锁屏 除了按住手机电源键进行锁屏外&#xff0c;还有其他一些快捷方法可以实现锁屏操作。 对于苹果手机用户&#xff0c;可以按照以下步骤进行设置&#xff1a; 1.打开手机的设置应用&#xff0c;通常可以在主屏幕或应用列表中找到该图标。 2.在设置…...

传染病学模型 | Matlab实现SIS传染病学模型 (SIS Epidemic Model)

文章目录 效果一览基本描述模型介绍程序设计参考资料效果一览 基本描述 传染病学模型 | Matlab实现SIS传染病学模型 (SIS Epidemic Model) 模型介绍 SIS模型是一种基本的传染病学模型,用于描述一个人群中某种传染病的传播情况。SIS模型假设每个人都可以被感染,即没有免疫力,…...

s2020gc56收集数据

作答区域&#xff1a; #include<bits/stdc.h> using namespace std; int n,k,s1,s2,h1,h2,he,ans,r2,r1,l2,l11,f[1000009]; int main() {cin>>n>>k;for(int i1;i<n;i)cin>>f[i];for(int i1;;i){s1;if(s1>k)break;h1h1f[i];}for(int in;;i--){…...

SEO优化需要天天更新文章吗?

SEO优化并不要求每天都更新文章。 更新频率取决于你网站的内容类型、目标受众和业务需求。以下是一些建议&#xff1a; 高质量内容&#xff1a;关键是提供有价值且吸引人的内容。不要为了更新而随意发布低质量或重复的内容。确保你的文章有深度、独特性和相关性&#xff0c;以…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...