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() 在类方法中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

箭头函数“this”绑定在 React 组件中不起作用 [重复]

array_map 在类中不起作用

Django @csrf_exempt 在类视图中不起作用

触摸功能在 SpriteKit 中不起作用吗

我的部分动画在 SpriteKit 中不起作用

按钮 ClickListener 在 LibGDX 游戏中不起作用