注:与Python什么呢`超()``中__new__`
import weakref
class CarModel:
_models = weakref.WeakValueDictionary()
def __new__(cls, model_name, *args, **kwargs):
model = cls._models.get(model_name)
if not model:
model = super().__new__(cls)
cls._models[model_name] = model
return model
def __init__(self, model_name, air=False):
if not hasattr(self, "initted"):
self.model_name = model_name
self.air = air
self.initted=True
问题1一个轻量级实现的一部分>什么super()
是什么意思?这是否意味着CarModel
的父类?
问题2>我也很难理解函数__new__
的工作原理吗?具体来说,下面一行。
model = super().__new__(cls)
为__new__
描述:
构造函数被调用
__new__
而非__init__
,和 接受且只有一个参数,那就是被构造(它 被调用之前的对象是类构建,所以没有自我 的说法)。它也必须返回新创建的对象。
@Ben,基于[文档](http://docs.python.org/py3k/reference/datamodel。html#objects-values-and-types),'__new __()'返回'cls'的一个实例。为什么OP中的代码'model = super().__ new __(cls) '可以创建'cls'的实例? CarModel的超类如何知道如何创建其子类的实例? – q0987 2012-01-30 13:06:20
这将是一个伟大的SO问题(如果它还没有被问到)。简短的答案是,您将'cls'参数传递给当前类。最终没有办法实际创建一个新的实例,而不会一直回到'object .__ new__',因为Python没有“分配实例”的指令。但'object .__ new__'知道要创建它传递的类的一个实例(它也是'object'的一个实例,因为一切都是'object'的一个实例)。 – Ben 2012-01-30 23:22:21