Подтвердить что ты не робот

Как расширить класс в 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

Спасибо

4b9b3361

Ответ 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.