super() 在类方法中不起作用
Posted
技术标签:
【中文标题】super() 在类方法中不起作用【英文标题】:super() doesn't work in classmethod 【发布时间】:2018-03-02 04:45:46 【问题描述】: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 在这里不起作用?
【问题讨论】:
【参考方案1】:from_buffer
实际上并不是Structure
上的类方法;它是Structure
的类型(即它的元类)上的一个方法。因此,它不能以通常的方式被覆盖:这就像要求覆盖单个 object 的普通方法,而不是 class。
调用type(cls).from_buffer(cls,buf)
有效。这很糟糕,但我没有立即看到其他选择。
【讨论】:
谢谢!我认为它可能是元类的产物,但我不知道如何解决它。这种技术效果很好。 我觉得没那么可怕。当然,这比仅仅为了这样做而对元类本身进行子类化要好。以上是关于super() 在类方法中不起作用的主要内容,如果未能解决你的问题,请参考以下文章