Расширьте класс str, чтобы получить дополнительные параметры - PullRequest
4 голосов
/ 10 февраля 2012

Я хочу создать новый класс, который представляет собой специальный тип строки.Я хочу, чтобы он наследовал все методы класса str, но я хочу иметь возможность передавать ему дополнительный параметр, который он может использовать.Примерно так:

class URIString(str, ns = namespace): # ns defaults to global variable namespace
    def getLocalName(self):
        return self[(self.find(ns)+len(ns)):] # self should still act like a string
        # return everything in the string after the namespace

Я знаю, что синтаксис неправильный.Но, надеюсь, это передает идею, к которой я стремлюсь.

1 Ответ

7 голосов
/ 10 февраля 2012

Вы хотели бы сделать что-то вроде этого:

class URIString(str):
    _default_namespace = "default"

    def __init__(self, value, namespace=_default_namespace):
        self.namespace = namespace

    def __new__(cls, value, namespace=_default_namespace):
        return super().__new__(cls, value)      

    @property
    def local_name(self):
        return self[(self.find(self.namespace)+len(self.namespace)):]

Я использовал декоратор @property, чтобы превратить getLocalName() в атрибут local_name - в python методы получения / установки считаются плохимипрактика.

Обратите внимание, что перед Python 3.x вам нужно использовать super(URIString, cls).__new__(cls, value).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...