python中的staticmethod和classmethod是否不可调用?

时间:2019-03-23 18:33:28

标签: python python-3.x metaclass

我正在编写一个元类来强制类和实例方法的文档字符串。令我惊讶的是,staticmethod和classmethod并不像实例方法那样callable。我不确定为什么吗?

class MyMeta(type):
    def __new__(cls, name, parents, attrs):
        print(cls, name, parents, attrs)

        if "__doc__" not in attrs:
            raise TypeError("Please define class level doc string!!!")

        for key, value in attrs.items():
            if callable(value) and value.__doc__ is None:
                raise TypeError("Please define def level doc string!!!")

        return super().__new__(cls, name, parents, attrs)

class A(metaclass=MyMeta):
    """This is API doc string"""
    def hello(self):
        """"""
        pass

    def __init__(self):
        """__init__ Method"""
        pass

    @classmethod
    def abc(cls):
        pass

我无法理解为什么它们不能被呼叫?如果我没有为他们定义文档字符串,它们似乎可以通过我的检查。

1 个答案:

答案 0 :(得分:2)

它们不能被呼叫。 classmethodstaticmethoddescriptor objects,它们没有实现__call__HOWTO实际上给出了如何在纯python中实现它们的示例,例如classmethod对象:

class ClassMethod(object):
    "Emulate PyClassMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        def newfunc(*args):
            return self.f(klass, *args)
        return newfunc

注意,功能对象也是描述符。它们恰好是可调用的描述符。