super() 在类方法中不起作用

super() doesn't work in classmethod

ctypes 有一个类方法 from_buffer。我正在尝试向子类中的 from_buffer() 添加一些自定义处理,但我无法调用 super()。这是一个例子:

from ctypes import c_char, Structure


class Works(Structure):
    _fields_ = [
        ("char", c_char),
    ]


class DoesntWork(Works):
    @classmethod
    def from_buffer(cls, buf):
        print "do some extra stuff"
        return super(DoesntWork, cls).from_buffer(buf)


print Works.from_buffer(bytearray('c')).char
print DoesntWork.from_buffer(bytearray('c')).char

这会导致错误:

c
do some extra stuff
Traceback (most recent call last):
  File "superctypes.py", line 18, in <module>
    print DoesntWork.from_buffer(bytearray('c')).char
  File "superctypes.py", line 14, in from_buffer
    return super(DoesntWork, cls).from_buffer(buf)
AttributeError: 'super' object has no attribute 'from_buffer'

我错过了什么?为什么 super 在这里不起作用?

from_buffer 实际上不是 Structure 上的 class 方法;它是 Structure 类型(即它的 metaclass)的方法。因此,它不能以通常的方式被覆盖:这就像要求覆盖单个 object 的普通方法,而不是 class.

调用 type(cls).from_buffer(cls,buf) 有效。这非常糟糕,但我没有立即看到其他选择。