【问题标题】:How to extend a static base constructor?如何扩展静态基础构造函数?
【发布时间】:2015-10-27 16:22:22
【问题描述】:

我正在使用 Python bitmap package

它几乎可以满足我的所有需求,但它不适用于我的应用程序所需的十六进制值,因此我将其扩展如下:

import bitmap
class BitMap(bitmap.BitMap):
    def tohexstring(self):
        val = self.tostring()
        st = "{0:0x}".format(int(val,2))
        return st.zfill(self.sz/4)

基类有一个来自字符串的静态构造函数:

bitmap.BitMap.fromstring("01010101")

我可以将十六进制值转换为bin:

bitmap.BitMap.fromstring(format(int("aa",16),"08b"))

但返回的类是原始位图类,而不是扩展类。

如何使用这个构造函数但仍然返回我的扩展类?

【问题讨论】:

  • 你为什么不在你的子类中为十六进制实现fromstring?请注意,使用与超类相同的名称可能并不理想。

标签: python static-constructor


【解决方案1】:

bitmap.BitMap.fromstring 是一个类方法,不是静态方法,但是被作者错误的实现了。行:

bm = BitMap(nbits)

应该是

bm = cls(nbits)

在这种情况下,您可以在您的子类上调用fromstring 并获得子类的一个实例。您可以分叉存储库,实现它并发出拉取请求以将其包含在包中(或仅在包中使用您的分叉)。你也可以在他们的 repo 上提出问题,看看他们希望你如何继续。

或者,在您自己的子类中正确实现 fromstring 并隐藏损坏的基类实现。

【讨论】:

  • 是的,我刚刚意识到这一点(在您在我的回答中指出之前大约 2 秒)。很遗憾作者正确使用了@classmethod,但随后错误地实现了它...
  • @mgilson 看起来确实很奇怪 - 如果他们使用 pylint 或其他东西,它会告诉他们他们实际上并没有使用该参数。
【解决方案2】:

你可能不能——如果构造函数是静态的,而不是类方法,你将不得不完全覆盖旧的构造函数。当然,您可以在覆盖中调用旧的,将属性复制到新的子类实例,并在您确实需要时将其返回。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2012-01-09
    • 2022-12-03
    • 2017-08-17
    • 2011-10-17
    • 2018-11-24
    • 2020-06-16
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多