公司动态

大语言模型学习@classmethod装饰器

📅 2026/8/22 11:06:44
大语言模型学习@classmethod装饰器
当中, 是一个被内置的类装饰器, 它的核心作用在于, 把一个方法定义为乃是“类方法”, 而非“实例方法”。1. 基本语法定义那个类方法之际, 得在函数的上方添加上 装饰器, 而且那个方法的头一个参数必定是 cls, 这是按约定被普遍采用的写法, 它代表着 Class。class :def (cls, arg1, arg2):# cls 代表类本身可以通过它访问类的属性或其他类方法打印, 格式化输出, 里边内容为“这是一个类方法。当前类是: ”加上类名, 这里的类名以变量cls表示有个点。2. 核心区别self vs cls这是一个将实例方法、类方法以及静态方法放置于一起进行对比的行为, 其目的在于促使你达成彻底理解的结果。方法类型装饰器第一个参数访问权限调用方式实例方法self (实例)可以访问实例属性 类属性 父类obj.()类方法cls (类)可以访问类属性 父类 (不能直接访问实例属性)Class.() 或 obj.()静态方法只能访问传入的参数无法直接访问类或实例Class.()3. 为什么要用 应用场景于实际开展开发期间, 最为平常的两个运用之处是, 工厂模式, 以及对类的状态予以修改。场景 A实现“工厂方法” (最常用)若你期望给出多种创建对象的途径, 类方法是极为有用的, 它能够接纳各异的参数, 经处理之后返回一个类的实例。构建一个 User 类别, 能够借助“姓名/年龄”来构建, 并且能用“JSON 字符串”来构建。jsonclass User:def (self, name, age):self.name nameself.age age这是一个类方法, 它充任“工厂”, 用于把 JSON 加以转换, 使之成为 User 对象。def (cls, ):data json.loads()需要留意, 在此处运用的是 cls(...), 并非 User(...)。# 这般去做所存在的益处在于: 要是往后子类对 User 展开继承, 那么 cls 便会自行朝着子类进行指向。cls(namedataname, agedataagedef (self):双引号内是用户名冒号加上自身名字, 逗号隔开, 年龄冒号加上自身年龄。# 1. 常规创建方式 (实例方法)user1 User(张三, 25)# 2. 使用类方法创建 (工厂模式)等同于, 一个表示为, 双引号括起来的, 包含姓名为李四, 年龄为30的, 由花括号包裹的内容。user2 User.()执行print(user1)操作, 其输出结果为User: 张三, Age: 25。进行打印操作, 打印的对象是user2 , 其输出的内容为, User冒号 李四逗号 Age冒号 30句号。场景 B操作类级别的属性共享状态若你有需求一个变量于所有实例之间进行共享, 且想拥有一个方法用以统一去修改此变量。举例统计该类一共创建了多少个实例。class Robot:count 0 # 类属性所有机器人共享def (self, name):self.name nameRobot.() # 每创建一个实例调用类方法增加计数def (cls):cls.count 1 # 修改类属性def (cls):f目前总共有 {cls.count} 个机器人。r1 Robot(R2-D2)r2 Robot(C-3PO)使用print函数, 打印Robot.()的结果, 其输出内容为, 目前总共有2个机器人。4. 回到你之前的 sort1.py 代码分析在你的 sort1.py 中 类大量使用了 和 class :def (bz, 1599):# 在此处运用, 缘由在于这个函数仅仅依赖着输入参数bz, 并不需要去访问类内部的任何事物, 是这样的情况。def (cls, , 1599):# 这里用 是因为在方法内部调用了 cls.()# 和 cls.()。启用 cls 而非 , 致使代码更具通用性于若往后存在子类继承它的情形之下。为何此处要用 而并非直接去写函数呢? 首先存在命名空间管理, 即把所有跟 PDF 处理有关联的逻辑均封装于类中, 以此来防止全局变量对于函数造成污染, 其次是逻辑关联, 它依赖于某些事物, 将它们放置在同一个类里, 从语义方面告知其他开发者说: “这两个功能呈现出配套的状态”。总结