甘肃省住房和城乡建设部网站首页,ip怎么做网站,郑州做网站销售怎么样,网站开发流程框架好的#xff0c;这是真实的场景#xff1a;我正在编写一个应用程序#xff0c;我有一个类#xff0c;它表示某种类型的文件#xff08;在我的例子中#xff0c;这是照片#xff0c;但细节与问题无关#xff09;。照片类的每个实例对于照片的文件名都应该是唯一的。
问题…好的这是真实的场景我正在编写一个应用程序我有一个类它表示某种类型的文件在我的例子中这是照片但细节与问题无关。照片类的每个实例对于照片的文件名都应该是唯一的。
问题是当用户告诉我的应用程序加载文件时我需要能够识别文件何时已加载并使用该文件名的现有实例而不是在同一文件名上创建重复实例。
对我来说这似乎是一个很好的使用记忆化的环境有很多这样的例子但是在这种情况下我不仅仅是在记忆一个普通的函数我需要记忆__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)。
有人知道我哪里做错了吗有没有更好的方法来做这个
另一种思考方式是它类似于单例只是它不是全局单例只是每个文件名都是单例。
如果你想一起看的话。