python小知识-classmethod类方法

简介: 类方法:@classmethod装饰的方法,参数有一个隐含参数cls,表示类本身,类可以直接调用

python类提供了三种不同的方法:

  • 普通方法:参数带self, 是类实例化才能访问的方法,
  • 静态方法:@staticmethod装饰的方法,通常是与类对象无关的方法,如工具计算,类可直接调用
  • 类方法:@classmethod装饰的方法,参数有一个隐含参数cls,表示类本身,类可以直接调用

我们来看一下例子:

class Person(object):
    a = 0
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def info(self):
        print( 'name={}'.format(self.name), 'age={}'.format(self.age))
        
    def change_age(self):
        self.age = self.age + self.a
    
    @classmethod
    def add(cls):
        print("classmethod a id = ", id(cls.a))
        cls.a = cls.a + 1
        
    @classmethod
    def create_engineer(cls, name, age):
        return cls('engineer:{}'.format(name), age)
    
    @staticmethod
    def bmi(height, kg):
        return kg / height ** 2
wedo = Person('wedo', 30)
wedo.change_age()
wedo.info()
print('a = {}'.format(Person.a))

# name=wedo age=30
# a = 0

wedo2 = Person('wedo2', 35)
wedo2.change_age()
wedo2.info()
print('a = {}'.format(Person.a))

# name=wedo2 age=35
# a = 0

从上面调用例子来看,

  • wedo/wedo2是Person类的一个实例对象,
  • a是Person类属性同时所有实例共享的属性
  • name和age是类实例属性, 不同实例值可以不同。

让我们来通过类方法来修改下类属性a


Person.add()
print('a = {}'.format(Person.a))

# classmethod a id =  1644522528
# a = 1

wedo2.change_age()
wedo2.info()
print('a = {}'.format(Person.a))

wedo.change_age()
wedo.info()
print('a = {}'.format(Person.a))

# name=wedo2 age=36
# a = 1
# name=wedo age=31
# a = 1

wedo.add()
print('a={}'.format(Person.a), 'wedo 2 a={}'.format(wedo2.a))
# classmethod a id =  1644522560
# a=2 wedo2-a=2

从上可知,类方法可以通过Person类直接调用(当然也可以实例调用),来改变不同实例的共享类属性。在类方法中通过cls来表示类本身,以便访问类本身的属性;当然也可以创建类的实例。

在上面的例子,我们通过类方法create_engineer,实现了新的Person的初始化实例。

engineer = Person.create_engineer('wedo3', 40)
engineer.info()
# name=engineer:wedo3 age=40

那么类方法的作用是什么?总结一下:

  • 类方法可以统一控制类属性,并影响所有实例对象;这在需要对所有实例进行同步控制的时候特别有用
  • 类方法,可以向工厂方法一样,重新定义类的实例化;这可以在处理不同初始化的的情况使用

希望以上,对你有帮助。

目录
相关文章
|
5月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
446 1
|
6月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
213 2
|
6月前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
173 0
|
6月前
|
传感器 大数据 API
Python数字限制在指定范围内:方法与实践
在Python编程中,限制数字范围是常见需求,如游戏属性控制、金融计算和数据过滤等场景。本文介绍了五种主流方法:基础条件判断、数学运算、装饰器模式、类封装及NumPy数组处理,分别适用于不同复杂度和性能要求的场景。每种方法均有示例代码和适用情况说明,帮助开发者根据实际需求选择最优方案。
283 0
|
6月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
5月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
629 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
7月前
|
安全 Python
Python语言中常用的文件操作方法探讨
通过上述方法的结合使用,我们可以构筑出强大并且可靠的文件操作逻辑,切实解决日常编程中遇到的文件处理问题。
281 72
|
5月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
6月前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
337 4
|
8月前
|
存储 机器学习/深度学习 人工智能
稀疏矩阵存储模型比较与在Python中的实现方法探讨
本文探讨了稀疏矩阵的压缩存储模型及其在Python中的实现方法,涵盖COO、CSR、CSC等常见格式。通过`scipy.sparse`等工具,分析了稀疏矩阵在高效运算中的应用,如矩阵乘法和图结构分析。文章还结合实际场景(推荐系统、自然语言处理等),提供了优化建议及性能评估,并展望了稀疏计算与AI硬件协同的未来趋势。掌握稀疏矩阵技术,可显著提升大规模数据处理效率,为工程实践带来重要价值。
374 58

推荐镜像

更多