【发布时间】:2018-11-25 19:00:15
【问题描述】:
我有数据,每个条目都需要是一个类的实例。我希望在我的数据中遇到许多重复的条目。我本质上希望得到一组所有唯一条目(即丢弃任何重复项)。但是,实例化整个批次并在事后将它们放入一个集合中并不是最优的,因为...
- 我有 很多 个条目,
- 预计重复条目的比例会相当高,
- 我的
__init__()方法对每个唯一条目进行了大量昂贵的计算,因此我想避免不必要地重做这些计算。
我知道这与here 提出的问题基本相同,但是...
接受的答案实际上并不能解决问题。如果您让
__new__()返回一个现有实例,从技术上讲,它不会创建一个新实例,但它仍然调用__init__(),然后重做您已经完成的所有工作,这使得覆盖__new__()完全没有意义。 (这很容易通过在__new__()和__init__()中插入print语句来演示,这样您就可以看到它们何时运行。)当您想要一个新实例时,另一个答案需要调用类方法而不是调用类本身(例如:
x = MyClass.make_new()而不是x = MyClass())。这可行,但恕我直言,这不是理想的做法,因为这不是创建新实例的正常方式。
__new__() 是否可以被覆盖,以便返回一个现有的实体而不再次在其上运行__init__()?如果这不可能,是否有其他方法可以解决这个问题?
【问题讨论】:
-
是什么让你说“创建一个新实例不是正常的做法。”?在 Python 中,使用类方法作为构造函数是一种非常标准的做法。
-
MyClass.make_new()绝对是要走的路。让MyClass()返回一个现有对象对于阅读代码的开发人员来说一点也不明显。避免出人意料的行为。这是 C++ 程序员有时会陷入的陷阱:在重载运算符后面隐藏陷阱。 -
看来你要创建一个单例类:stackoverflow.com/questions/6760685/…
-
注意,通常你可以使用元类
__call__方法:stackoverflow.com/questions/6966772/… -
@MadPhysicist 在我组织的代码中没有构造函数,在我参加的几个 Python MOOC 中也没有教过我。这就是我这么说的原因。但我可能会弄错,因为我的经验有限。
标签: python class duplicates instance