Уведомления

Группа в Telegram: @pythonsu

#1 Май 1, 2013 09:02:48

Space
Зарегистрирован: 2013-05-01
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про наследование от базовых классов

К примеру, я хочу создать расширенный класс для управления строками:

class SuperString(str):
    def __init__(self, sourcestr):
        print(self)
        super().__init__(self, sourcestr.upper())
s = SuperString('mystring')
print(s)

Результатом выполнения будет:
>>> mystring
>>> mystring

Как видно конструктор не переопределился, но все же был кем-то вызван.

Как правильно переопределить базовый класс, чтобы конструктор был переопределен также?

UPDATE: Python 3

Отредактировано Space (Май 1, 2013 09:03:25)

Офлайн

#2 Май 1, 2013 10:23:44

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Вопрос про наследование от базовых классов

class SuperString(str):
    def __new__(cls, arg):
        return super().__new__(cls, arg.upper())

Отредактировано Shaman (Май 1, 2013 10:24:02)

Офлайн

#3 Май 1, 2013 10:41:43

Space
Зарегистрирован: 2013-05-01
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про наследование от базовых классов

Shaman
Спасибо, заработало.
Смутило что __init__ везде упорно называют конструктором.

Офлайн

#4 Май 1, 2013 11:47:35

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Вопрос про наследование от базовых классов

Space
Смутило что __init__ везде упорно называют конструктором.
А это так и есть. __init__ Это конструктор.
http://habrahabr.ru/post/114585/
class Ts(object):
    def __init__(self,s):
        self.s=s
    def __str__(self):
        return self.s
class Tss(Ts):
    def __init__(self,s):
        super(Tss,self).__init__(s.upper())
a=Tss("asda")
>>> print a
ASDA
просто строка неизменяемый объект



Офлайн

#5 Май 1, 2013 13:20:10

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Вопрос про наследование от базовых классов

Space
Смутило что __init__ везде упорно называют конструктором.
Сначала при помощи статичного метода __new__ создается экземпляр объекта, а затем он инициализируется в __init__, если таковой определён. Следует иметь в виду, что часть базовых средств языка определена на низком уровне и может себя вести неожиданным образом.

Офлайн

#6 Май 1, 2013 13:43:45

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Вопрос про наследование от базовых классов

нужно наследоваться от UserString

Офлайн

#7 Май 2, 2013 10:12:14

Space
Зарегистрирован: 2013-05-01
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про наследование от базовых классов

Спасибо, ребята!
Благодаря вам разобрался

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version