为什么__new__没有classmethod装饰器

时间:2019-10-15 01:57:51

标签: python

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

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

在没有装饰器的情况下,该方法如何能够充当classmethod

1 个答案:

答案 0 :(得分:2)

它是特殊情况。如果type.__new__在创建类时发现您定义了staticmethod而未应用__new__,则会在创建类时自动应用staticmethod。 (此外,__new__应该是staticmethod,而不是classmethod。)

请参见docs

  

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

implementation

    /* 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);
    }