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,认识精益生产管理
精益生产是一种系统性的生产管理方法,旨在最大化价值,最小化浪费,以及提高产品质量和客户满意度。它源于丰田生产系统(TPS),是一种基于流程优化、以人为本的管理方法,强调优化生产流程、减少浪费…...
HashSet创建String类型的数据
package com.test.Test07;import java.util.HashSet;public class TestString {//这是一个main方法,是程序的入口public static void main(String[] args) {//创建一个HashSet集合HashSet<String> hs new HashSet<>();hs.add("hello");Syste…...

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

10 工具Bootchart的使用(windows)
Bootchart的使用方法(windows) 下载bootchart.jar并拷贝到windows, 然后保证windows也安装了open jdk 1.8; 下载地址: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%的跨境人
领英作为一款目前市面上最多人使用的在线职场社交媒体软件,是我们这些跨境电商人拓展客户的好渠道,并且很容易找到相应的外贸客户。但是领英的玩法并不像其他社交媒体平台一样简单,规则比较多,很多国内的用户都是胡乱操作…...
Linux——网络套接字1|socket编程
IP地址(公网IP),标定了主机的唯一性。 通常情况,把数据送到对方的机器是目的吗? 不是的,真正的网络通信过程其实是进程间通信,如客户端进程和服务器进程,我们把数据在主机间转发仅仅是手段,机器收到数据之后,需要将数据交付给指定的进程,当客户端有多个进程在运行时…...
stable-diffusion-webui服务器centos部署实践(成功)
之前关注stable-diffusion仅仅是因为stable-diffusion模型,但实践证明,stable-diffusion如果么有那么好的提示词功力,恐怕生成的图就是“畸形的,缺胳膊少腿的,多一块,少一块的”,如V1实践,V2实践,纸糊效果。 如果做不到其他人那样“美女自给自足”,那么我这个“大佬…...

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

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

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

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

s2020gc56收集数据
作答区域: #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优化并不要求每天都更新文章。 更新频率取决于你网站的内容类型、目标受众和业务需求。以下是一些建议: 高质量内容:关键是提供有价值且吸引人的内容。不要为了更新而随意发布低质量或重复的内容。确保你的文章有深度、独特性和相关性,以…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...