python实例化对象做实参_如何在Python中记住类实例化?

好的,这是真实的场景:我正在编写一个应用程序,我有一个类,它表示某种类型的文件(在我的例子中,这是照片,但细节与问题无关)。照片类的每个实例对于照片的文件名都应该是唯一的。

问题是,当用户告诉我的应用程序加载文件时,我需要能够识别文件何时已加载,并使用该文件名的现有实例,而不是在同一文件名上创建重复实例。

对我来说,这似乎是一个很好的使用记忆化的环境,有很多这样的例子,但是在这种情况下,我不仅仅是在记忆一个普通的函数,我需要记忆__init__()。这带来了一个问题,因为当__init__()被调用时,已经太晚了,因为已经创建了一个新实例。

在我的研究中,我发现了Python的__new__()方法,实际上我可以编写一个工作简单的示例,但是当我试图在我的真实对象上使用它时,它崩溃了,我不知道为什么(我唯一能想到的是,我的真实对象是我无法真正控制的其他对象的子类,因此,这种方法有一些不兼容之处)。这就是我所拥有的:class Flub(object):

instances = {}

def __new__(cls, flubid):

try:

self = Flub.instances[flubid]

except KeyError:

self = Flub.instances[flubid] = super(Flub, cls).__new__(cls)

print 'making a new one!'

self.flubid = flubid

print id(self)

return self

@staticmethod

def destroy_all():

for flub in Flub.instances.values():

print 'killing', flub

a = Flub('foo')

b = Flub('foo')

c = Flub('bar')

print a

print b

print c

print a is b, b is c

Flub.destroy_all()

输出如下:making a new one!

139958663753808

139958663753808

making a new one!

139958663753872

<__main__.Flub object at 0x7f4aaa6fb050>

<__main__.Flub object at 0x7f4aaa6fb050>

<__main__.Flub object at 0x7f4aaa6fb090>

True False

killing <__main__.Flub object at 0x7f4aaa6fb050>

killing <__main__.Flub object at 0x7f4aaa6fb090>

太完美了!只为给定的两个唯一id创建了两个实例,Flub.instances显然只列出了两个。

但是当我尝试对我正在使用的对象使用这种方法时,我得到了各种各样的荒谬错误,关于__init__()如何只使用0个参数,而不是2个参数。所以我会改变一些东西,然后它会告诉我__init__()需要一个参数。完全奇怪。

经过一段时间的斗争,我基本上放弃了,把所有的__new__()黑魔法移到了一个名为get的staticmethod中,这样我就可以调用Photograph.get(filename),如果filename不在Photograph.instances中,它只会调用Photograph(filename)。

有人知道我哪里做错了吗?有没有更好的方法来做这个?

另一种思考方式是它类似于单例,只是它不是全局单例,只是每个文件名都是单例。

如果你想一起看的话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bupt summer training for 16 #3 ——构造

https://vjudge.net/contest/172464 后来补题发现这场做的可真他妈傻逼 A.签到傻逼题&#xff0c;自己分情况 1 #include <cstdio>2 #include <vector>3 #include <algorithm>4 5 using std::vector;6 using std::sort;7 8 typedef long long ll;9 10 int n…

Python02期(北京)课程笔记索引

day01 初始python关于使用notepad运行python程序注释和语句分类 day02 命名方式和关键字数据类型数据类型转换 day03 变量与数据类型运算和运算符进制转换 day04 循环结构 day05 函数概述 day06 nonlocal和global 关键字详解 day07 python核心,内建函数高阶函数字…

python常用快捷键、写代码事半功倍_Pycharm常用快捷键总结及配置方法

工欲善其事必先利其器&#xff0c;Python开发利器Pycharm常用快捷键以及配置如下&#xff0c;相信有了这些快捷键&#xff0c;你的开发会事半功倍 一 常用快捷键 编辑类&#xff1a; Ctrl D 复制选定的区域或行 Ctrl Y 删除选定的行 Ctrl Alt L 代码格式化 Ctrl Alt O 优…

PHP中的魔术常量

魔术常量 PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的&#xff0c;只有在加载了这些扩展库时才会出现&#xff0c;或者动态加载后&#xff0c;或者在编译时已经包括进去了。 有八个魔术常量它们的值随着它们在代码中的位置改变而改…

Java中的继承性特性

继承性是java中的第二特性之一。而继承性最为关键的地方为&#xff1a;代码重用性的问题&#xff0c;利用继承性可以从已有的类中继续派生出新的子类&#xff0c;也可以利用子类扩展出更多的操作功能。 继承性的实现代码为&#xff1a;class 子类 extends 父类{ } 有以下3点说…

10大html5前端框架

Bootstrap 首先说 Bootstrap&#xff0c;估计你也猜到会先说或者一定会有这个( 呵呵了 )&#xff0c;这是说明它的强大之处&#xff0c;拥有框架一壁江山的势气。自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者废的决心&#xff0c;来让自己成长。结果受到周围各 种…

多媒体技术复习汇总 收藏

多媒体技术复习汇总 收藏 1. 什么是媒体&#xff1a;媒体是信息表示和传输的载体。2. 媒体分类&#xff1a;感觉媒体&#xff0c;表示媒体&#xff0c;表现媒体&#xff0c;存储媒体&#xff0c;传输媒体3. 多媒体技术的定义和特点&#xff1a;多媒体技…

PHP中的语法特点小结

PHP中的语法特点小结 1.PHP的变量开头要加上$符号,见到$就知道这个是一个变量 2.PHP中的常量才是不用加$符号的 3.PHP中$可以用来嵌套使用,从而实现动态的变量名的层级调用 4.PHP程序<?php开头,结尾可以加上?>,也可以不加 5.PHP中的常量有着魔术常量(系统自带的) 6.PH…

滚动行为

new router({ scrollBehavior (to, from, savaPosition) { if(savePosition) { //历史记录的前进后退记住的之前滚动到的位置 return savePosition } else { return {x: 0, y: 0} } //history模式下 定位到某个元素失效的解决办法 if(to.hash) { return { selector: to.h…

使用FFMPEG SDK解码流数据获得YUV数据及其大小

本文以H264视频流为例&#xff0c;讲解解码流数据的步骤。 为突出重点&#xff0c;本文只专注于讨论解码视频流数据&#xff0c;不涉及其它&#xff08;如开发环境的配置等&#xff09;。如果您需要这方面的信息&#xff0c;请和我联系。 准备变量 定义AVCodecContext。如果您…

关于Python3.7和Python3.6中元组类型数据内存存储问题

关于Python3.7和Python3.6中元组类型数据内存存储问题 小编最近发现了一个瑕疵 当定义一个元组类型的变量后,若在程序后面再定义一个元组变量,这两个元组的内容相同,那么在不同的版本中会出现不同的结果 在Python3.6版本中,解释器将在内存中开辟两个内存空间分别存储两个元组的…

shell 删除了hdfs 文件_从零开始学大数据(三) Shell操作HDFS文件系统-中

1、格式化[rootmaster sbin]# hdfs namenode -format2、命令hdfs dfsadmin查看(hdfs dfsadmin -report)[rootmaster ~]# hdfs dfsadmin -report安全模式#获取安全模式状态[rootmaster ~]# hdfs dfsadmin -safemode get#进入安全状态[rootmaster ~]# hdfs dfsadmin -safemode en…

计算机硬件

计算机硬件 一、为什么要学习计算机基础 程序员编程的本质就是让计算机去工作&#xff0c;而编程语言就是程序员与计算机沟通的介质。程序员要想让计算机工作&#xff0c;就要知道计算机能干什么、是怎么样的一个完成过程&#xff0c;这也是我们必须学习计算机基础的原因。 …

当编程作为一种爱好

一、当编程作为一种爱好&#xff0c;时刻关心一段代码如何实现。 二、当把工具操作得足够熟悉&#xff0c;闭眼即能达到代码述写的规范。 三、程序呀&#xff0c;如果爱上你是我的错&#xff0c;我打算一错到底。转载于:https://www.cnblogs.com/spiriter88/p/6913539.html

Python中的函数概述

1.python中函数概述 概念 模块化编程的思想 有组织,可共享(重复使用,实现特定的功能的代码块) 提高程序的可维护性,提高开发效率,提高代码的重用性定义一个函数 1.语法:def 函数名称(形参列表):函数体/代码块return 返回值 2.定义参数介绍 def :关键字 用于函数的定义,函数的…

铁路售票系统_铁路资讯:复兴号动车、智能京张高铁…中国最高端铁路装备看这里...

今天上午&#xff0c;两年一度的中国国际现代化铁路技术装备展在京开展&#xff0c;会期3天&#xff0c;将集中展示路网建设、客货运输、经营管理、工程建造、技术装备、旅客服务等铁路行业各领域的先进产品及技术。展会现场智能京张&#xff1a;将首次实现时速350公里自动驾驶…

H.264的NALU,RTP封包说明(转自牛人)

H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: --------------- |0|1|2|3|4|5|6|7| -------- |F|NRI| Type | --------------- F: 1 个比特.forbidden_zero_bit. 在 H.264 规…

CentOS下安装MySQL报安装文件conflicts错误:

2019独角兽企业重金招聘Python工程师标准>>> 第一&#xff1a;报这个错误&#xff0c;说明已经安装或相关文件已经存在&#xff0c;把已经存在的文件卸载了就可以了&#xff1a; rpm -e --nodeps mysql-libs-5.1.* 转载于:https://my.oschina.net/u/3197158/blog/1…

inc指令是什么意思_西门子PLC一些指令

指令(英文全称意思)∶指令含义1、LD ( Load装载):动合触点2、LDN (Load Not不装载):动断触点3、A(And与动合):用于动合触点串联4、AN (And Not与动断):用于动断触点串联5、o(Or 或动合):用于动合触点并联6、ON(Or Not 或动断):用于动断触点并联7、(Out输出):用于线圈输出8、OLD…

python核心,内建函数,高阶函数

晨测 global和nonlocal区别 写一个递归的阶乘回顾 1.global和nonlocal 关键字 2.函数的递归 1.查找规律 2.设置退出条件 3.性能 3.闭包 外函数中定义一个内函数 外函数的返回值是内函数的引用 内函数引用外函数的变量,未来外函数执行完毕,不会释放被内函数引用变量 4.总结 1.…