为什么new
方法上没有类装饰器?例如:
class MyClass:
@classmethod
def __new__(cls, *args, **kwargs):
pass
在没有装饰器的情况下,该方法如何能够充当classmethod
?
答案 0 :(得分:2)
它是特殊情况。如果type.__new__
在创建类时发现您定义了staticmethod
而未应用__new__
,则会在创建类时自动应用staticmethod
。 (此外,__new__
应该是staticmethod
,而不是classmethod
。)
请参见docs:
被调用以创建类 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);
}