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'
我错过了什么?为什么不在这里超级工作?
答案 0 :(得分:2)
from_buffer
实际上并不是Structure
上的类方法;它是Structure
类型的方法(即它的元类)。因此,它不能以通常的方式被覆盖:它就像要求覆盖单个对象的常规方法,而不是类
致电type(cls).from_buffer(cls,buf)
有效。它非常可怕,但我不会马上看到另一种选择。