super()在classmethod中不起作用

时间:2017-09-21 00:33:07

标签: python python-2.7 ctypes metaclass

ctypes有一个classmethod 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'

我错过了什么?为什么不在这里超级工作?

1 个答案:

答案 0 :(得分:2)

from_buffer实际上并不是Structure上的类方法;它是Structure类型的方法(即它的元类)。因此,它不能以通常的方式被覆盖:它就像要求覆盖单个对象的常规方法,而不是

致电type(cls).from_buffer(cls,buf)有效。它非常可怕,但我不会马上看到另一种选择。