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

目录

十二.静态方法

十三.类方法

十四.类对象

类对象的概念

类对象的作用

实例对象怎么用类对象

[内置函数 - dir](#内置函数 - dir)


十二.静态方法

概述

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

答:可以

静态方法的概念

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

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

python 复制代码
class 类名:
    @staticmethod
    def 静态方法名():
        pass

代码示例

python 复制代码
class Calculator:
    """计算器类"""

    def __init__(self):
        # 定义2个默认值
        self.num1 = 0
        self.num2 = 0

    @staticmethod
    def 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

python 复制代码
class 类名:
    @classmethod
    def 类方法名(cls):
        pass

示例代码

python 复制代码
class Tool:
    tools_num = 0  # 定义一个类属性,用来存储共享的数据

    def __init__(self, name):
        self.name = name
        Tool.tools_num += 1

    def print_info_1(self):
        print("工具的总数为:", Tool.tools_num)

    @classmethod
    def 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__,那除了它之外还有哪些呢?怎么查看呢?

python 复制代码
dir(实例对象)
python 复制代码
['__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__']

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

相关推荐
毕设源码-郭学长14 分钟前
【开题答辩全过程】以 基于python电商商城系统为例,包含答辩的问题和答案
开发语言·python
black0moonlight15 分钟前
win11 isaacsim 5.1.0 和lab配置
python
知乎的哥廷根数学学派19 分钟前
基于多尺度注意力机制融合连续小波变换与原型网络的滚动轴承小样本故障诊断方法(Pytorch)
网络·人工智能·pytorch·python·深度学习·算法·机器学习
网安CILLE20 分钟前
PHP四大输出语句
linux·开发语言·python·web安全·网络安全·系统安全·php
jjjddfvv21 分钟前
超级简单启动llamafactory!
windows·python·深度学习·神经网络·微调·audiolm·llamafactory
A先生的AI之旅24 分钟前
2025顶会TimeDRT快速解读
人工智能·pytorch·python·深度学习·机器学习
程序员小远31 分钟前
完整的项目测试方案流程
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
程序猿阿伟33 分钟前
《量子算法开发实战手册:Python全栈能力的落地指南》
python·算法·量子计算
雪风飞舞1 小时前
python根据音频生成柱状图
开发语言·python·音视频
学Linux的语莫1 小时前
python开发知识点
python