Python面向对象编程-类方法与静态方法

Python面向对象编程详解

Python是一种面向对象的编程语言,面向对象的编程方法涉及很多概念和技巧,其中两个重要的知识点包括:类方法与静态方法如何通过面向对象的方式解决实际问题。以下是对这些知识点的详细讲解。

1. 类方法与静态方法

1.1 类方法 (@classmethod)

  • 类方法是属于类而非实例的方法。它们的第一个参数是类本身,而不是类的实例。
  • 通常使用 @classmethod 装饰器来标记类方法。
  • 类方法常用于需要访问类属性或类方法的场景,而不需要实例化对象。

类方法通过装饰器 @classmethod来定义,格式如下:

语法:
python 复制代码
@classmethod
def 方法名(cls) :
    方法代码

@classmethod必须位于方法(函数)上面一行

使用示例:
python 复制代码
class Student:
    company = "类属性"  # 类属性

    @classmethod
    def printCompany(cls):
        print(cls.company)  #可以通过cls关键字取调用类属性

Student.printCompany()  #可以直接使用类名取调用方法
print(Student.company) #不需要实例化就可以访问类属性
输出:
复制代码
类属性
类属性

解释:在上面的例子中:

  • cls:指的就是"类对象"本身
  • Student.printCompany()因为使用了@classmethod声明他是类方法;可以直接通过类调用,无需实例化

和普通调用类方法有什么区别?

特性 普通方法 类方法
访问属性 通过实例 (self) 访问类属性和实例属性 通过类 (cls) 访问类属性
第一个参数 self(实例对象) cls(类本身)
访问实例属性 可以访问实例属性和类属性 只能访问类属性,不能访问实例属性
调用方式 需要先创建实例,然后通过实例调用 可以直接通过类调用,无需实例化
使用场景 适用于需要依赖实例的属性或方法 适用于需要访问类级别的属性或方法

示例代码

  • 以前访问类属性或者方法(需要创建一个实例对象):
python 复制代码
class Student:
    company = "类属性"  # 类属性

    def printCompany(self):
        print(Student.company)  #可以通过类调用类属性

s1=Student() #实例化对象
s1.printCompany()  #通过对象调用方法
print(s1.company) #通过对象调用属性
  • 现在通过类方法访问类属性或者方法(不需要创建实例即可访问):
python 复制代码
class Student:
    company = "类属性"  # 类属性

    @classmethod
    def printCompany(cls):
        print(cls.company)  #可以通过cls关键字取调用类属性

Student.printCompany()  #可以直接使用类名取调用方法
print(Student.company) #不需要实例化就可以访问类属性

1.2 静态方法 (@staticmethod)

静态方法是属于类,但它不需要访问类或实例的任何属性或方法。它通常用于一些与类相关,但又不依赖于类或实例的功能。静态方法使用 @staticmethod 装饰器。

可理解为:静态方法就像是定义在类外面的普通函数,只不过它是作为类的一部分存在的

语法:
python 复制代码
@staticmethod
def 方法名(cls) :
    方法代码
使用示例:
python 复制代码
class Student:
    company = "SXT"  # 类属性

    @staticmethod  #声明为静态方法
    def add(a, b):  # 静态方法
        print(a+b)
        return a + b

Student.add(20, 30)  #可以通过类名直接调用方法,实例方法不可以
  • add 是静态方法,它没有 clsself 参数,仅依赖传入的参数进行计算
输出:
复制代码
50

1.3 类方法与静态方法的区别

特性 类方法 (@classmethod) 静态方法 (@staticmethod)
第一个参数 cls,表示类本身 没有 clsself,不与类或实例绑定
访问类属性和实例属性 可以通过 cls 访问类属性,不能访问实例属性 不能访问类属性或实例属性(能访问,但不推荐)
目的 处理与类相关的操作,修改类的状态(类属性) 不依赖类或实例,通常用于实现与类逻辑相关但独立的功能
调用方式 可以通过类名或实例调用 可以通过类名或实例调用
用途 常用于操作类属性或进行类级别的逻辑 常用于实现与类相关但不依赖类状态的功能
示例 @classmethod def method(cls): ... @staticmethod def method(a, b): ...
  • 类方法:访问类的属性和方法,并且第一个参数是类本身。
  • 静态方法:不访问类或实例的任何属性或方法,完全独立。

2. 综合案例:使用类方法、静态方法

现在,我们结合类方法、静态方法,编写一个简单的案例,学生管理系统。

2.1 学生管理系统

我们设计一个学生类作为基类,包含类方法和静态方法

python 复制代码
class Student:
    company = "ClassAttribute"  # 类属性

    @classmethod  # 类方法,适合访问类属性
    def printCompany(cls):
        print(f"类方法调用的类属性为: {cls.company}")

    @staticmethod  # 静态方法,不应该访问类属性
    def add(a, b):
        print(a + b)
        return a + b

# 使用类方法访问类属性
Student.printCompany()  # 输出:Company: SXT

# 使用静态方法
Student.add(20, 30)  # 输出:50

2.2 输出:

makefile 复制代码
学校名称: 华东理工大学
当前学生总数: 2
欢迎信息: 欢迎加入华东理工大学!

2.3 解释

突出区别:

  • 类方法

    • 通过 cls 访问类的属性和方法。可以修改类的状态,例如更新 total_students
    • 通常用来处理和类本身相关的操作。
  • 静态方法

    • 不需要访问类的状态,也不依赖实例状态。它是完全独立的功能实现。
    • 用于一些独立的操作(例如这里的 greet(),只需要输出一条消息)。

希望这个案例能清楚地展示它们的区别!

总结

在Python中,面向对象编程的核心包括类方法、静态方法。通过类方法和静态方法可以让类提供通用的功能,理解和掌握这些概念可以让你的代码更加高效和可维护。

相关推荐
2025学习1 小时前
Spring循环依赖导致Bean无法正确初始化
后端
l0sgAi1 小时前
最新SpringAI 1.0.0正式版-实现流式对话应用
后端
parade岁月1 小时前
从浏览器存储到web项目中鉴权的简单分析
前端·后端
用户91453633083912 小时前
ThreadLocal详解:线程私有变量的正确使用姿势
后端
用户4099322502122 小时前
如何在FastAPI中实现权限隔离并让用户乖乖听话?
后端·ai编程·trae
阿星AI工作室2 小时前
n8n教程:5分钟部署+自动生AI日报并写入飞书多维表格
前端·人工智能·后端
郝同学的测开笔记2 小时前
深入理解 kubectl port-forward:快速调试 Kubernetes 服务的利器
后端·kubernetes
Ray662 小时前
store vs docValues vs index
后端
像污秽一样3 小时前
软件开发新技术复习
java·spring boot·后端·rabbitmq·cloud
Y_3_73 小时前
Netty实战:从核心组件到多协议实现(超详细注释,udp,tcp,websocket,http完整demo)
linux·运维·后端·ubuntu·netty