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)。

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

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

如果你想一起看的话。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值