为什么__new__没有类方法装饰器

  • 本文关键字:类方法 new python
  • 更新时间 :
  • 英文 :


为什么new方法上没有类装饰器?例如:

class MyClass:
@classmethod
def __new__(cls, *args, **kwargs):
pass

这种方法如何在没有装饰器的情况下充当classmethod

它是特别特殊情况的。type.__new__将在创建类时自动应用staticmethod如果它发现您定义了__new__而没有应用staticmethod。(另外,__new__应该是staticmethod,而不是classmethod

请参阅文档:

调用以创建类cls的新实例。__new__()是一个静态方法(特殊情况,因此您不需要将其声明为这样(,它将请求实例的类作为其第一个参数......

和实施:

/* Special-case __new__: if it's a plain function,
make it a static function */
tmp = _PyDict_GetItemId(dict, &PyId___new__);
if (tmp != NULL && PyFunction_Check(tmp)) {
tmp = PyStaticMethod_New(tmp);
if (tmp == NULL)
goto error;
if (_PyDict_SetItemId(dict, &PyId___new__, tmp) < 0) {
Py_DECREF(tmp);
goto error;
}
Py_DECREF(tmp);
}

最新更新