如何扩展静态基础构造函数?

时间:2015-10-27 16:22:22

标签: python static-constructor

我正在使用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)

基类有一个来自string的静态构造函数:

bitmap.BitMap.fromstring("01010101")

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

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

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

如何使用此构造函数但仍返回扩展类?

2 个答案:

答案 0 :(得分:2)

bitmap.BitMap.fromstring是一个类方法,而不是静态方法,但作者已经错误地实现了它。这一行:

bm = BitMap(nbits)

应该是

bm = cls(nbits)

在这种情况下,您可以在子类上调用fromstring并获取子类的实例。你可以分叉回购,实现它并发出一个拉请求,让它包含在包中(或者只是在你的包中使用你的fork)。你也可以在他们的回购中提出一个问题,看他们如何选择继续。

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

答案 1 :(得分:0)

您可能无法 - 如果构造函数是静态的,而不是classmethod,则必须完全覆盖旧的构造函数。当然,您可以在覆盖中调用旧的,将属性复制到新的子类实例,如果确实需要,则返回该属性。