【发布时间】:2012-01-29 21:26:28
【问题描述】:
注意:使用 Python 实现享元的一部分
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__,并且 只接受一个参数,即正在构造的类(它 在构造对象之前调用,所以没有self 争论)。它还必须返回新创建的对象。
【问题讨论】:
-
@Ben,基于document,
__new__()返回cls的实例。为什么OP中的代码model = super().__new__(cls)可以创建cls的实例? CarModel 的超类如何知道如何创建其子类的实例? -
这本身就是一个很好的 SO 问题(如果还没有被问到的话)。简短的回答是您将使用
cls参数传递给它当前类。最终,如果不一直推迟到object.__new__,就根本无法实际创建一个新实例,因为 Python 没有“分配实例”的指令。但是object.__new__知道创建它所传递的类的实例(这也将是object的实例,因为一切都是object的实例)。
标签: python python-3.x