Python中classmethod的妙用

news2024/11/16 2:56:54

a7854b44c76534c4f202aaaa16c62302.jpeg

更多Python学习内容:ipengtao.com

在Python中,@classmethod装饰器为开发者提供了一种强大的工具,使得类方法的定义和使用更加灵活。本文将深入探讨classmethod的妙用,通过丰富的示例代码展示其在不同场景下的实际应用。

类方法与实例方法的区别

首先,回顾类方法和实例方法之间的基本区别。类方法是属于类的,而不是属于实例的。这意味着类方法可以在没有实例的情况下调用,并且可以访问和修改类级别的属性。

class MyClass:
    class_variable = "I am a class variable"

    def __init__(self, instance_variable):
        self.instance_variable = instance_variable

    @classmethod
    def class_method(cls):
        print(f"Accessing class variable: {cls.class_variable}")

# 调用类方法
MyClass.class_method()

类方法的妙用之一:工厂方法

classmethod常常被用作工厂方法,用于创建类的实例。这种模式在构建对象时提供了更灵活的选择,并将构造逻辑封装在类中。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def create_puppy(cls, name):
        return cls(name=name, age=0)

# 使用工厂方法创建实例
puppy = Dog.create_puppy("Buddy")

类方法的妙用之二:与继承结合

类方法在处理与类相关的操作时尤为有用,尤其是在涉及到继承的情况下。它们可以在子类中灵活地操作类级别的属性,而无需直接引用类名。

class Shape:
    all_shapes = []

    def __init__(self, name):
        self.name = name
        Shape.all_shapes.append(self)

    @classmethod
    def print_all_shapes(cls):
        for shape in cls.all_shapes:
            print(shape.name)

# 创建子类
class Circle(Shape):
    def __init__(self, name, radius):
        super().__init__(name)
        self.radius = radius

# 使用类方法操作父类的属性
Circle.print_all_shapes()

类方法的妙用之三:备选构造方法

classmethod还可以用作备选构造方法,为开发者提供多种初始化对象的途径。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def create_from_birth_year(cls, name, birth_year):
        age = 2023 - birth_year
        return cls(name, age)

# 使用备选构造方法创建实例
person = Person.create_from_birth_year("Alice", 1990)

类方法的妙用之四:在单例模式中的应用

单例模式是一种常见的设计模式,保证一个类仅有一个实例,并提供一个访问它的全局点。classmethod可以用于实现单例模式,确保在多次调用时始终返回相同的实例。

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

# 使用类方法获取单例实例
singleton_1 = Singleton()
singleton_2 = Singleton()

print(singleton_1 is singleton_2)  # 输出 True

类方法的妙用之五:与装饰器结合

classmethod与装饰器结合使用时,可以实现更高级的功能。例如,我们可以定义一个装饰器,用于记录类方法的调用次数。

def count_calls(method):
    def wrapper(cls, *args, **kwargs):
        wrapper.call_count += 1
        print(f"Method {method.__name__} called {wrapper.call_count} times")
        return method(cls, *args, **kwargs)
    
    wrapper.call_count = 0
    return wrapper

class Counter:
    @classmethod
    @count_calls
    def do_something(cls):
        print("Doing something...")

# 使用带有装饰器的类方法
counter = Counter()
counter.do_something()
counter.do_something()

总结

在本文中,我们分享了Python中@classmethod装饰器的妙用,从工厂方法、继承结合、备选构造方法、单例模式到与装饰器的结合运用。@classmethod为类方法提供了更多灵活性,使得我们能够更加巧妙地设计和使用类。通过工厂方法,学会了如何通过类方法创建对象的实例,提供了一种灵活的对象构建方式。在继承结合中,@classmethod让我们能够在子类中使用类方法,有效地扩展和重写父类的行为。

备选构造方法展示了如何通过类方法提供不同的构造方式,使得对象的创建更富有选择性和适应性。在单例模式中,@classmethod成为实现单例模式的利器,确保在多次调用时返回同一个实例,实现了全局唯一的对象。最后,与装饰器结合的运用为类方法增添了更高级的特性,通过一个简单的示例展示了如何用装饰器记录类方法的调用次数。这些实例不仅展示了@classmethod的妙用,也为读者提供了在实际项目中更好地运用类方法的思路和方法。@classmethod是一个功能丰富而强大的工具,掌握了它的用法,有助于提高代码的可读性、可维护性,使得类的设计更加灵活和高效。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

f24618219abf0ce33cd82567f24657d7.png

点击“阅读原文”,获取更多学习内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1250933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Visual Studio 中文注释乱码解决方案

在公司多人开发项目中经常遇到拉到最新代码,发现中文注释都是乱码,很是emjoy..... 这是由于编码格式不匹配造成的,如果你的注释是 UTF-8 编码,而文件编码是 GBK 或者其他编码,那么就会出现乱码现象。一般的解决办法是…

【鬼鬼鬼iiARPG开发记录】

鬼鬼鬼ARPG开发记录 一、创建项目1、创建3D(URP)项目2、导入新的输入系统(input system)3、勾选Enter Play Mode Options 二、导入资源1、创建若干文件夹 一、创建项目 1、创建3D(URP)项目 2、导入新的输入系统(input system) …

lvm 扩容根分区失败记录

lvm 扩容根分区失败记录 1、问题描述2、错误描述3、解决方法重启系统进入grub界面,选择kernel 2.x 启动系统。然后同样的resize2fs命令扩容成功。 1、问题描述 根分区不足。 系统有2个内核版本,一个是kernel 2.x,另一个是kernel 4.x。 这次l…

Leetcode201. 数字范围按位与

Every day a Leetcode 题目来源:201. 数字范围按位与 最直观的解决方案就是迭代范围内的每个数字,依次执行按位与运算,得到最终的结果,但此方法在 [left, right] 范围较大的测试用例中会因超出时间限制而无法通过,因…

Kafka配置SASL认证密码登录

​​​​​​1、修改config/server.properties,添加如下内容 listenersSASL_PLAINTEXT://内网ip:9092 advertised.listenersSASL_PLAINTEXT://外网ip:9092 security.inter.broker.protocolSASL_PLAINTEXT sasl.mechanism.inter.broker.protocolPLAIN sasl.enabled.…

【开源】基于JAVA的森林火灾预警系统

项目编号: S 019 ,文末获取源码。 \color{red}{项目编号:S019,文末获取源码。} 项目编号:S019,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟…

中职组网络安全-FTPServer20221010.img(环境+解析)

任务环境说明: √服务器场景:FTPServer20221010.img √服务器操作系统:未知(关闭链接) √FTP用户名:attack817 密码:attack817 1.分析attack.pcapng数据包文件,通过分析数据包attack…

电子学会C/C++编程等级考试2021年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字放大 给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。 时间限制:1000 内存限制:65536输入 包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格…

鸿蒙开发-ArkTS 语言-基础语法

1. 初识 ArkTS 语言 ArkTS 是 HarmonyOS 优选主力开发语言。ArkTS 是基于 TypeScript (TS) 扩展的一门语言,继承了 TS 的所有特性,是TS的超集。 主要是扩展了以下几个方面: 声明式UI描述和自定义组件: ArkTS使用声明式的方式描述用…

物联网中基于信任的安全性调查研究:挑战与问题

A survey study on trust-based security in Internet of Things: Challenges and issues 文章目录 a b s t r a c t1. Introduction2. Related work3. IoT security from the one-stop dimension3.1. Output data related security3.1.1. Confidentiality3.1.2. Authenticity …

JSP JSTL引入依赖并演示基础使用

然后 我们来讲 JSTL Java server pages standarded tag library 简称 JSTL 这是 一个 JSP的标准标签库 JSP标准标签的集合 封装了JSP中的通用核心功能 根据JSTL类库提供的标签 可以将他分为5个类 1 核心标签 2 格式化标签 3 SQL标签 4 XML标签 5 函数标签 这边 我们主要将 核…

Linux的gcc,gdb基础

执行详解: 1)如何执行 路径可执行文件名 或者 路径可执行文件名 & (将进程放到后台执行); 可以把可执行文件放到 /usr/bin 就可以省略路径了; 思考:为什么? ps :/usr/bin ps,ls,pwd (先了解,后期写项目就知道为什么了) 2)两步执行与一步执行 a.可以三步合为一步,即…

HTML4总结

一、前序知识 1. 认识两位先驱 2. 计算机基础知识 1. 计算机俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算、逻辑计算,还 具有存储记忆功能。 2. 计算机由 硬件 软件 成: 硬件:看得见摸得着…

十大排序之归并排序(详解)

文章目录 🐒个人主页🏅算法思维框架📖前言: 🎀归并排序 时间复杂度O(n*logn)🎇1. 算法步骤思想🎇2、动画演示🎇3.代码实现 🐒个人主页 🏅算法思维框架 &#…

如何打造垂直LLM的护城河

B2B人工智能初创企业的一个伟大策略是打造“垂直人工智能”产品:成为特定行业的人工智能助手,比如律师、金融服务、医生。 听起来很简单:你可以利用LLM的超能力,并将其应用于宠物行业的特定数据和用例。 这就是我们在Explain所做的…

excel表中慎用合并单元格,多用跨列居中

如下一个excel例表: 要将首行居中,最好的办法如下: 1、选中首行单元格 2、按下ctrl1,调出“设置单元格格式”,选中“对齐”,在“水平对齐”中选择“跨列居中” 3、完成任务 这样居中的好处是:可…

五分钟,Docker安装flink,并使用flinksql消费kafka数据

1、拉取flink镜像,创建网络 docker pull flink docker network create flink-network2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES"jobmanager.rpc.ad…

HCIP-八、路由引入

八、路由引入 实验拓扑实验需求及解法1.配置所有设备的IP地址。2.R1/2/3/4运行OSPF3.R3/4/5运行IS-IS4.在R3/4上将OSPF 1引入IS-IS5.在R3/4上将IS-IS引入OSPF6.路径优化 实验拓扑 实验需求及解法 本实验模拟OSPF与IS-IS互联的网络环境,完成以下需求: 1…

linux开启apache服务

vim /etc/apache2/ports.conf 键盘输入i 进入插入编辑模式,修改apache2默认监听端口号为8080 ,编辑好后,按Esc键“:wq!” 保存退出。(注:端口也可以不修改) 在终端输入“/etc/init.d/apache2 …

微信公众号对接获取用户openid预约项目心路全历程

公众号对接获取openid全历程 一、背景二、选型三、开始修改若依框架四、自己搭后端框架五、前端框架uni-app修改六、对接获取公众号登录用户openId七、总结 一、背景 老板接了朋友的一个公众号需求,要求做一个简单的疫苗预约系统。功能是获取当前登录用户&#xff0…