Python中classmethod的妙用

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.mfbz.cn/a/185943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb】TomcatJavaWebHTTP

Tomcat&JavaWeb&HTTP 文章目录 Tomcat&JavaWeb&HTTP一、Tomcat1.1 版本选择及安装1.2 目录1.3 WEB项目部署的方式 二、IDEA中Java Web开发部署流程三、HTTP协议3.1 发展历程3.2 HTTP协议的会话方式3.3 请求报文3.4 响应报文 一、Tomcat Tomcat是Apache 软件基…

postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第35讲&#…

【CVE-2021-1675】Spoolsv打印机服务任意DLL加载漏洞分析

漏洞详情 简介 打印机服务提供了添加打印机的接口,该接口缺乏安全性校验,导致攻击者可以伪造打印机信息,在添加新的打印机时实现加载恶意DLL。这造成的后果就是以system权限执行任意代码。 影响版本 windows_10 20h2 windows_10 21h1 win…

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法: 第一步:需要自备华硕6个底包工厂安装包(EDN.KIT.OFS.SWP.HDI.TLK)或者自己备份的iso/esd/wim等镜像恢复 支持系列: 灵耀系列原装系统 无畏系列原装系统 枪…

原型 原型对象 原型链

在面向开发对象开发过程中对每一个实例添加方法,会使每一个对象都存在该添加方法造成空间浪费 通过对原型添加公共的属性或方法,使所有实例对象都可访问 原型为了共享公共的成员 prototype 原型: JS为每个构造函数提供一个属性prototype(原型),它的值…

黑马点评笔记 分布式锁

文章目录 分布式锁基本原理和实现方式对比Redis分布式锁的实现核心思路实现分布式锁版本一Redis分布式锁误删情况说明解决Redis分布式锁误删问题分布式锁的原子性问题分布式锁-Redission分布式锁-redission可重入锁原理分布式锁-redission锁重试和WatchDog机制分布式锁-redissi…

oled的使用 动态的变量 51

源码均在IIC手写程序中 外部中断实现变量加一 #include "reg52.h" #include "main.h" #include <intrins.h> #include "OLED.h" #include "bmp.h" #include "Delay.h" sbit LED1 P1^0; sbit LED2 P1^1; sbit LED3…

Ubuntu20.04上编译安装TVM

本文主要讲述如何在ubuntu20.04平台上编译TVM代码并在python中import tvm成功。 源代码下载&#xff1a; git clone --recursive https://github.com/apache/tvm tvm 平台环境升级&#xff1a; 1&#xff09; sudo apt-get update 2&#xff09; sudo apt-get install -y pyth…

电源控制系统架构(PCSA)之电源管理基础设施组件

目录 6.5 电源管理基础设施组件 6.5.1 电源策略单元 6.5.2 时钟控制器 6.5.3 低功耗Distributor 6.5.4 低功耗Combiner 6.5.5 P-Channel到Q-Channel转换器 6.5 电源管理基础设施组件 6.5.1 电源策略单元 本节介绍电源策略单元(Power Policy Unit, PPU)。PPU的完整细节见…

我在electron中集成了自己的ai大模型

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、大模型选择二、获取key三、调用api四、调用ai模型api时&#xff0c;解决跨域总结 前言 最近单位把gpt、文心一言、通义千问、星火等等等等你能想到的ai大模型都给禁掉了&#xff0c;简直丧心病狂。 不知道有多少感同…

搭建SRS视频服务器

去官方网站下载FFmpeg6.1 https://ffmpeg.org/download.html拷贝到CentOS7.9中的/opt目录下&#xff0c;解压并重命名 tar -xvf ffmpeg-6.1.tar.xz 解压后编译安装 ./configure make make install从github下载SRS4.0release 解压后 如果ffmpeg的路径不在/usr/local/bin/ffmpe…

698. 划分为k个相等的子集

698. 划分为k个相等的子集 Java&#xff1a;回溯 class Solution {boolean[] used;int target;private boolean backtracking(int[] nums, int k, int sum, int start) {if (k 0) {return true; // 找到&#xff1a;立即中断栈&#xff01;并返回值}if (sum target) { // 构…

VMware Workstation 17 虚拟机自启动失效 解决脚本

VMware Workstation17新增加了虚拟机自启配置 但是很奇怪在我的一台计算机上能够自启&#xff0c;在另一台计算机上就失效 编写脚本 以命令方式完成虚拟机开机自启 #虚拟机自启.batif "%1""hide" goto CmdBegin start mshta vbscript:createobject("w…

LED驱动控制专用电路

一、基本概述 TM1628是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU 数 字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。 主要适用于家电设备(智能热水器、微波炉、洗衣机、空调…

yo!这里是c++11重点新增特性介绍

目录 前言 列表初始化 { }初始化 initializer_list类 类型推导 auto decltype 范围for 右值引用与移动语义 左值引用和右值引用 移动语义 1.移动构造 2.移动赋值 3.stl容器相关更新 右值引用和万能引用 完美转发 关键字 default delete final和override …

数组题目: 665. 非递减数列、453. 最小移动次数使数组元素相等、283. 移动零、189. 旋转数组、396. 旋转函数

665. 非递减数列 题解&#xff1a; 题目要求一个非递减数列&#xff0c;我们可以考虑需要更改的情况&#xff1a; nums {4, 2, 5} 对于这个nums&#xff0c;由于2的出现导致非递减&#xff0c;更改的情况就是要么4调到<2&#xff0c;要么2调到4,5. nums {1, 4, 2, 5} …

Javascript每天一道算法题(十五)——轮转数组_中等(一行解决轮转数组)

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——while遍历&#xff08;较为复杂&#xff0c;不推荐&#xff09;&#xff08;2&#xff09;方法2&#xff08;直接截取后插入&#xff0c;推荐&#xff09;&#xff08;3&#xff09;方法3——优化方法2&a…

局域网协议:VLAN技术介绍

文章目录 VLAN概述VLAN的优点VLAN的原理VLAN的配置推荐阅读 VLAN概述 VLAN&#xff08;Virtual Local Area Network虚拟局域网&#xff09;是一种在物理网络基础上划分逻辑上独立的局域网的技术。它允许将网络设备按照逻辑上的需求而非物理位置进行分组&#xff0c;提供更好的…

@RequestMapping

目录 作用&#xff1a; 位置&#xff1a; 属性 1.value 2.method 3.params 4.header 作用&#xff1a; 该注解是一个用来处理请求地址映射的注解。 位置&#xff1a; 可用于映射一个请求或一个方法&#xff0c;可以用在类或方法上。 用于方法上&#xff0c;表示在类的…

OSG粒子系统与阴影-雾效模拟(1)

虚拟现实中有很多效果&#xff0c;如雨效、雪效、雾效等&#xff0c;这些都可以通过粒子系统来实现。一个真实的粒子系统的模式能使三维场景达到更好的效果。 本章对OSG粒子系统的使用以及生成自定义粒子系统的方法进行了详细介绍最后还附带说明了阴影的使用方法。在实时的场景…