2015-10-27 2 views
0

Я использую 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") 

я могу сделать один из шестнадцатеричного преобразования шестнадцатеричного значения в бункер:

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

Но возвращенный класс является исходным классом растрового изображения, а не расширенным.

Как я могу использовать этот конструктор, но все же вернуть свой расширенный класс?

+0

Почему вы не реализуете 'fromstring' для hex в вашем подклассе? Обратите внимание, что присвоение того же имени, что и суперкласс, не является идеальным. – jonrsharpe

ответ

2

bitmap.BitMap.fromstring является методом класса, не статического метода, но был реализован неправильно автор. Линия:

bm = BitMap(nbits) 

должно быть действительно

bm = cls(nbits) 

в этом случае вы могли бы назвать fromstring на подклассе и получить экземпляр подкласса. Вы можете разблокировать репо, реализовать это и сделать запрос на перенос, чтобы включить это в пакет (или просто использовать свою вилку в своем пакете). Вы также можете задать вопрос о своем репо, чтобы узнать, как они предпочтут вам продолжить.

В качестве альтернативы, реализовать fromstring правильно в вашем собственном подклассе и затенять сломанную реализацию базового класса.

+0

Да, я просто понял это (около 2 секунд, прежде чем вы указали это на мой ответ). Печально, что автор _корректно использовал '@ classmethod', но затем внедрил его неправильно ... – mgilson

+0

@mgilson это кажется странным - если они использовали' pylint' или что-то, что они сказали бы им, что они фактически не используют аргумент. – jonrsharpe

0

Возможно, вы не сможете - если конструктор является статическим, а не classmethod, вам придется полностью переопределить старый конструктор. Конечно, вы могли бы назвать старый в своем переопределении, скопировать атрибуты в новый экземпляр подкласса и вернуть это, если вам действительно нужно.