• Python 中对_call__()方法的理解


    @[TOC](Python 中对_call__()方法的理解)

    欢迎学习交流!
    邮箱: z…@1…6.com
    网站: https://zephyrhours.github.io/

    一、类与对象的理解

    之前笔者在博客中分享了自己对python中的类和对象等比较容易混淆的概念理解,在此基础上,笔者继续说一下关于python中经常看到但是不会经常用的__call__() 方法的个人理解,希望对您有所帮助。

    延伸阅读:
    混淆概念详细解析:Python中类、对象、方法、函数和属性的区别和理解

    一般在Python使用中,我们经常会定义一些,方便调用,而定义的一般是一些方法的封装。
    通俗的理解: 类是一个抽象的大函数的集合,里面有很多小函数,通过这些类内的函数的相互组合,构成我们想要实现的功能和输出。

    因此,是一个抽象的概念,需要对其进行实例化后才会有意义,而实例化之后的称之为对象
    通俗的理解: 在定义类这个大函数集合时,一般我们都会留出变量,就好比f(x,y),其中f就可以理解为我们定义的类,而(x,y)就是其中我们预留的变量,方便我们输入任何想要的值,这样定义的函数才具有普遍适应性。而进行实例化后,就是对这个函数进行了变量的赋值,一旦对变量(x,y)进行赋值后,函数f就有了特定的输出,这时就称之为实例化,也就是变量变成了常量,输出也变成了常量。

    二、为什么要使用_call__()方法

    问题由来:

    一般来说,类进行实例化之后,就是把方法中的属性值变成了固定属性,就不能更改了,再次需要的时候,需要重新使用类函数进行属性的赋值。当定义的类中包含非常多的参数时,而且在某些场景中,我们需要多次使用同一个类,但是它们之间只有部分的数值差异时,多次将类进行实例化不仅耗费内存,而且会使程序显得臃肿,运行时间也会变长。

    _call__()方法的意义:

    其实在python的开发过程中,就已经意识到了这种问题。因此为了解决上面这个问题,我们会在自定义 中使用_call__()方法。它的产生就意味着,即使我们将一个类进行了实例化成为一个具体的对象后,仍能对这个具体的对象中的属性值进行修改。
    通俗的理解: 即使我们将一个类进行了具体的赋值,这个赋值之后的实例里面的属性值仍然时可以根据我们的需求进行必要的修改。

    三、具体实例分析

    对于初学python的人来说,的确对上面的各种概念会让你感到困惑,虽然笔者觉得自己已经讲得比较通俗易懂了,但是没有具体的实例进行解释,可能仍然会让人感到困惑,下面笔者给出一个具体的实例分析,希望对您的理解有所帮助。静下心来把下面这个实例代码看懂,你就明白了这个_call__()方法的具体作用了

    下面是我们定义的一个Picture()类,其中主要包括了四个属性(x, y, w, h),其中该类中内置了_call__()方法。具体代码如下,

    # 定义的Picture类
    class Picture:
        def __init__(self, x, y, w, h):
            self.x, self.y, self.w, self.h = x, y, w, h
            print('The original center position is ({},{})'.format(self.x, self.y))
            print('The original width and height are {} x {}'.format(self.w, self.h))
    
        def __call__(self, w, h):
            self.w, self.h = w, h
    
            print('The current center position is ({},{})'.format(self.x, self.y))
            print('The current width and height are {} x {}'.format(self.w, self.h))
    
    # 对Picture()类进行实例化,赋予属性x,y,w,h具体的数值,使其实例化为picture对象
    picture = Picture(100,100, 20, 10)
    print('----------------')
    # 对picture对象中的属性w,h进行二次更改
    picture(30, 15)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行结果如下:
    在这里插入图片描述

    在具体的使用过程中,我们需要首先对Picture()类中的四个属性(x, y, w, h),进行具体的赋值,将其实例化为一个具体的对象picture,在这个对象picture中,它的中心点坐标,宽高分别被实例化为(100,100, 20, 10)。在实例化之后,对象picture中的属性就变成了常量值,已经不可更改,但是通过_call__()方法,仍然可以对类picture中的w,h进行修改。此时原本picture中的中心点坐标x, y仍然保持不变,这样就方便了以后的调用和使用。

    如果不使用_call__()方法,那么若想更改其中的属性值,就需要对类进行重新的实例化,等价于下面的函数。

    picture1 = Picture(100,100, 30, 15)
    
    • 1

    具体的运行结果如下:
    在这里插入图片描述

  • 相关阅读:
    MySQL(case when then end, update)
    git 管理规范的思考
    leetcode:6243. 到达首都的最少油耗【变种子树大小统计 + 从边的角度出发 + 思维转换】
    Javascript知识【jQuery:数组遍历和事件】
    UE5 官方案例Lyra 全特性详解 10.进度汇报和视频推荐
    java生产者 消费者模式概念讲解
    亚马逊,富士康,腾讯等大厂的3亿美元打水漂,Android之父公司宣布关闭
    热点文章采集-热点资讯采集工具免费
    数据集:机器人理解世界的关键
    redis如何清空当前缓存和所有缓存
  • 原文地址:https://blog.csdn.net/NBDwo/article/details/126700662