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

pyhton基础【23】面向对象进阶四

目录

十二.静态方法

十三.类方法

十四.类对象

类对象的概念

类对象的作用

实例对象怎么用类对象

内置函数 - dir


十二.静态方法

概述

默认情况下,类中定义的方法是实例方法,即这个方法有一个默认的形参self,这个self会在方法被调用的时候指向对象。但是有些时候,我们并不需要对象的引用,即self没用,那该怎么处理呢?能不写self吗?

答:可以

静态方法的概念

如果一个方法不写self即不需要实例对象的引用,此时在定义方法的时候可以用@staticmethod对函数进行修饰,被修饰的函数就可以不写self

一句话:被@staticmethod修饰的方法,就是静态方法

class 类名:@staticmethoddef 静态方法名():pass

代码示例

class Calculator:"""计算器类"""def __init__(self):# 定义2个默认值self.num1 = 0self.num2 = 0@staticmethoddef show_menu():"""因为打印菜单功能方法并不需要self指向的对象,所以就考虑使用静态方法"""print("计算机 V2025.07")print("1. 加法")print("2. 减法")print("3. 乘法")print("4. 除法")print("5. 退出")def get_nums(self):self.num1 = int(input("请输入第1个数:"))self.num2 = int(input("请输入第2个数:"))def add(self):print(self.num1 + self.num2)def min(self):print(self.num1 - self.num2)def mul(self):print(self.num1 * self.num2)def div(self):print(self.num1 / self.num2)def run(self):while True:self.show_menu()op = input("请输入要进行的操作:")if op == "1":self.get_nums()self.add()elif op == "2":self.get_nums()self.min()elif op == "3":self.get_nums()self.mul()elif op == "4":self.get_nums()self.div()elif op == "5":break# 创建一个计算器对象
cal = Calculator()
# 调用计算器的运行方法
cal.run()运行效果:
计算机 V2025.07
1. 加法
2. 减法
3. 乘法
4. 除法
5. 退出
请输入要进行的操作:

简单总结

如果不需要用到对象,那么就可以将方法用@staticmethod进行修饰,如此一来此方法就变成了静态方法

十三.类方法

概述

为了更好的对类属性进行操作,Python提供了另外一种方法类方法。

类方法的概念

之前在学习静态方法的时候我们知道可以在方法的名字前面添加@staticmethod此时这个方法就是静态方法

与创建静态方法类似,如果想要让一个方法成为类方法我们只需要在这个方法的前面添加 @classmethod即可,与此同时需要在方法的第一个形参位置添加cls

class 类名:@classmethoddef 类方法名(cls):pass

示例代码

class Tool:tools_num = 0  # 定义一个类属性,用来存储共享的数据def __init__(self, name):self.name = nameTool.tools_num += 1def print_info_1(self):print("工具的总数为:", Tool.tools_num)@classmethoddef print_info_2(cls):print("工具的总数为:", cls.tools_num)tieqiao = Tool("铁锹")
chutou = Tool("锄头")
dianciluo = Tool("电磁炉")tieqiao.print_info_1()
Tool.print_info_2()
tieqiao.print_info_2()运行效果:
工具的总数为: 3
工具的总数为: 3
工具的总数为: 3

简单总结

  • 定义类方法时,前面添加@classmethod
  • 类方法的第一个形参,一般都叫做cls(当然了叫什么名字可以任意,但一般都用cls)
  • 调用类方法的时候,可以用实例对象、类对象调用,但无论用哪种方式调用,类方法中的cls指向类对象
十四.类对象

概述

之前在学习类属性的时候,我们提到过:类属性是可以在多个实例对象之间共享的属性。那么问题来了,类属性到底存在哪里呢?

答:类对象

类对象的概念

之前我们说到通过class定义的就是类(就是一个要创建的商品的模板),通过类名()创建出来的叫做实例对象。其实,定义的类(即用class定义的类)实际上也是一个对象。(试想即使我们把类称之为模板,模板不是空的,也是需要占用内存的)

定义的类其实就是一个对象,为了能够将这个对象与其创建出来的实例对象进行区分,将这个class定义的类叫做类对象

类对象的作用

我们知道实例对象是类 (即类对象)创建出来的,所以类对象对于实例对象而言是共享的,既然是共享的那么就干脆将实例对象都有的而且不变化的内容存储到类对象即可,这样会减少内容的占用。那哪些东西会存储在类对象中呢?

  1. 类属性
  2. 所有的方法

对你没有看错,除了熟知的类属性之外,类对象中存储了class定义的所有的方法(无论是魔法方法、实例方法、静态方法 、类方法都在类对象中存储),因为方法(函数)的代码是不变的,变化的仅仅是数据而已。

实例对象怎么用类对象

每个实例对象中都会有一个额外默认的属性__class__,这个属性指向了创建当前对象的模板即类对象,所以当调用实例对象.xxx()时,实际上实例对象.__class__.xxx()

内置函数 - dir

既然我们知道了实例对象中有默认的__class__,那除了它之外还有哪些呢?怎么查看呢?

dir(实例对象)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__','__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', 
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
'__weakref__']

这么多以__开始的属性或方法不用现在就研究它们的含义和使用方式,在后期的学习中用到什么我们就研究什么。

http://www.dtcms.com/a/268348.html

相关文章:

  • 爬虫的笔记整理
  • 在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控
  • Grok 4 最新技术评测与发布指南
  • 位置编码和RoPE
  • 光纤的最小弯曲半径是多少?
  • 商业秘密攻防战:技术信息与经营信息的界定之道
  • 基于Flask和机器学习开发的米其林餐厅数据可视化平台
  • 爬虫-request模块使用
  • CSS05:结构伪类选择器和属性选择器
  • 反向遍历--当你修改一个元素的outerHTML时,该元素会被从 DOM 中移除
  • 大模型RLHF中PPO强化学习代码学习笔记(二)
  • 回环检测 Scan Contex
  • DolphinScheduler 3.2.0 后端开发环境搭建指南
  • XML 笔记
  • 极简的神经网络反向传播例子
  • 用户中心Vue3项目开发2.0
  • Docker 容器编排原理与使用详解
  • 125.【C语言】数据结构之归并排序递归解法
  • FileZilla二次开发实战指南:C++架构解析与界面功能扩展
  • 操作系统王道考研习题
  • 76、覆盖最小子串
  • 【STM32】通用定时器PWM
  • 漫漫数学之旅046
  • ThreadLocal的挑战与未来:在响应式编程与虚拟线程中的演变
  • ARMv8 创建3级页表示例
  • 【嵌入式电机控制#11】PID控制入门:对比例算法应用的深度理解
  • Python数据容器-str
  • ch03 部分题目思路
  • 数据驱动实时市场动态监测:让商业决策跑赢时间
  • 端到端矢量化地图构建与规划