Как расширить класс в python?
В python, как вы можете расширить класс? Например, если у меня есть
color.py
class Color:
def __init__(self, color):
self.color = color
def getcolor(self):
return self.color
color_extended.py
import Color
class Color:
def getcolor(self):
return self.color + " extended!"
Но это не работает...
Я ожидаю, что если я буду работать в color_extended.py
, тогда, когда я создам объект цвета и использую функцию getcolor
, тогда он вернет объект со строкой "extended!". в конце. Также он должен иметь gotton init из импорта.
Предположим, что python 3.1
Спасибо
Ответы
Ответ 1
Использование:
import color
class Color(color.Color):
...
Если это Python 2.x, вы также хотели бы получить color.Color
из object
, чтобы сделать его классом нового стиля:
class Color(object):
...
Это не обязательно в Python 3.x.
Ответ 2
Еще один способ расширить (в частности, добавить новые методы, а не изменять существующие) классы, даже встроенные, - это использовать препроцессор, который добавляет возможность расширять область действия самого Python или выходить за ее пределы, преобразовывая расширение в нормальный синтаксис Python, прежде чем Python действительно увидит его.
Я сделал это для расширения класса Python 2 str()
, например. str()
является особенно интересной целью из-за неявной связи с данными в кавычках, такими как 'this'
и 'that'
.
Вот некоторый расширяющий код, в котором единственным добавленным не-Python-синтаксисом является бит extend:testDottedQuad
:
extend:testDottedQuad
def testDottedQuad(strObject):
if not isinstance(strObject, basestring): return False
listStrings = strObject.split('.')
if len(listStrings) != 4: return False
for strNum in listStrings:
try: val = int(strNum)
except: return False
if val < 0: return False
if val > 255: return False
return True
После чего я могу написать в коде, переданном препроцессору:
if '192.168.1.100'.testDottedQuad():
doSomething()
dq = '216.126.621.5'
if not dq.testDottedQuad():
throwWarning();
dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
print 'well, that was fun'
Препроцессор съедает это, выплевывает нормальный Python без патчей для обезьян, и Python делает то, что я намеревался сделать.
Так же, как препроцессор ac добавляет функциональность в c, так и препроцессор Python может добавлять функциональность в Python.
Моя реализация препроцессора слишком велика для ответа о переполнении стека, но для тех, кто может быть заинтересован, она здесь, на GitHub.