首页 > 编程语言 >Python中强大的动态类型特性,以方法调用为例

Python中强大的动态类型特性,以方法调用为例

时间:2023-12-19 21:57:31浏览次数:35  
标签:__ load 调用 为例 Python self model 方法 def

在研究大佬的项目时,从一行行代码溯源,拨茧抽丝的过程中,发现了方法调用的“神奇之处”

具体情况如下:

1. 在类Trainer中名为run等方法中有加载预训练好的模型的load方法

2. load()方法依旧是类方法中的一个,在load方法中有具体的load_self()方法

3. load_self()定义在另一个py文件models中,具体来说,models.py文件下有多个类中均定义了方法load_self()(共3个)

4. 所以当在class Trainer-->load()-->load_self()的调用中,会指向不同的三个类下的同名方法,在这个案例中三各类是继承于同一个“父亲”(nn.Module)

问题来了,当一个不属于该类的实例对象能使的动其他类下定义的方法吗(即使是同名的)


我们编写一个方法测试一下:

具体的思路是在test.py文件中,编写类方法,在test2.py中编写相关代码调用

首先是test.py

import torch.nn as nn

class Cnn(nn.Module):
    def __init__(self, model):
        self.model = model

    def loading(self):
        print("Cnn")

class Rnn(nn.Module):
    def __init__(self, model):
        self.model = model

    def loading(self):
        print("Rnn")

class Vae(nn.Module):
    def __init__(self, model):
        self.model = model

    def loading(self):
        print("Vae")

class Svm():
    def __inot__(self, model):
        self.model = model

    def loading(self):
        print("Vae")

为了还原项目中的发现,这里一些继承和命名有借鉴源项目,细节不重要

然后是test2.py

只要是还原源项目中的情况,细节不重要

class Use():
    def __init__(self, model):
        self.model = model

    def c(self):
        self.model.loading()

综上,在调用loading()方法时指向了四个”位置“

 在方法实现界面,也有相应的提示


 

实验

当其中的一个类如Cnn的实例化,可以调用其它的类的方法,这样可能会自动定位到自己类下的方法,所以把Cnn类中的loding方法注释掉 

model = Cnn()
use = Use(model)
use.c()

结果:

使用Rnn(带有loading方法)结果


 

总结

实例化哪个对象,类内部的方法还是要实现的,我所研究的项目的源代码应该是出现了一些bug,但是那个比较复杂,跑通可以进一步验证。在这个小实验中可以看到,在动态绑定同名方法中,如何实例化方法就链接到哪个方法中,即所谓的执行时才确定

 

标签:__,load,调用,为例,Python,self,model,方法,def
From: https://www.cnblogs.com/HOI-Yzy/p/17914882.html

相关文章

  • python - 批量压缩word图片
    主要分为3个步骤,提取图片,压缩图片,替换图片,需要用到python-docx和pillow1.提取图片importdocxdocName="test.docx"imageIndex=0document=docx.Document(docName)forrelindocument.part.rels.values():if"image"inrel.reltypeandhasattr(rel,"ta......
  • 决策树算法思想及其Python实现
    决策树算法是一种在机器学习和数据挖掘领域广泛应用的强大工具,它模拟人类决策过程,通过对数据集进行逐步的分析和判定,最终生成一颗树状结构,每个节点代表一个决策或一个特征。决策树的核心思想是通过一系列问题将数据集划分成不同的类别或值,从而实现对未知数据的预测和分类。这一算......
  • Python的Requests库与网页爬取
    requests库的几种方法 其他几个方法内部实际都调用了requests.request()方法 Response对象的属性 首先要使用r.status_code判断连接是否成功。 Request库的异常  爬取网页的通用代码  需要处理异常,使爬取网页变得更有效、可靠、稳定。  HTTP  无......
  • python中赋值语句教程
    1.赋值语句的特点赋值语句创建对象的引用:赋值语句总是创建对象的引用,而不是复制对象。因此,Python中的变量更像是指针,而不是数据储存区域。变量在首次赋值时会被创建:因此不需要提前声明变量。变量在引用前必须先赋值:如果引用未赋值的变量会报错2.赋值语句的形式(1.普通形......
  • python进行二进制数据处理的方法
    方法一:使用struct模块,特点轻量化,简单易用。缺点就是可读性不是太好,使用小数据临时使用一下,对于大量的数据解析,写起来比较繁琐,显得有点力不从心。importstructdata=b'\x92\xaa\xbb\xcc\x11\x22\x33\x44'a,b,c,d,e=struct.unpack(">BBBBI",data)print("a=0x%xb=0x%xc=......
  • python中导入模块/包的几种方式
    一、模块的导入方式模块就是.py类型的Python文件导入时不需要.py后缀,直接导入文件名即可1.利用import直接导入:语法:importmodule_name使用方式:module_name.class_name或者module.func_name2.利用import导入模块并设置一个别名语法:importmodule_nameasXXX使用方式:XXX.cl......
  • Python字典中 fromkeys()方法的坑
    fromkeys()方法类似于列表的浅拷贝首先用该方法创建一个字典dict_=dict.fromkeys(('a','b','c','d'),[])print(dict_)输出:{'a':[],'b':[],'c':[],'d':[]}当我向某个key添加value时,问题出现了dict_['b......
  • Python图像处理自动化:批量去除图片背景
    一、前言现在有较多的图片需要处理,需要将每张图片都去除背景。通常,我们使用像Photoshop这样的专业抠图软件或者在线抠图网页来处理,但这些方法通常只能一张一张地手动操作,效率低下。接下来将介绍使用Python批量处理,一键去除文件夹中所有图片的背景,从而大大提高工作效率。二、Python......
  • python代码自动打开浏览器并输入相应的内容后搜索
    需求描述:使用python代码实现自动打开浏览器,之后进入百度,输入‘小姐姐’,查看结果1.安装selenium,直接安装4.0版本。pipinstallselenium==4.0看到successful字样就安装成功了2.代码实现#@File:自动化测试.py#author:蜜蜂#Time:2023/12/1917:06importtimefromseleniumimpo......
  • opencv图像处理机器学习真实项目教程(python实现)1计算机视觉简介
    1计算机视觉简介欢迎来到计算机视觉的世界。本书将带您踏上令人兴奋且快速发展的计算机视觉和图像处理世界的旅程。本书首先介绍计算机视觉和OpenCV库。然后,我们将继续介绍本课程的基本库和所需的环境设置。主要内容:计算机视觉简介计算机视觉的应用PythonOpenCVOpenCV......