2010-02-16 2 views
1

Я хочу определить новый класс, который наследует сборку по типу str, и создать метод, который дублирует содержимое строки.Как получить доступ к строковому значению из нового класса, который наследует тип строки

Как получить доступ к строковому значению, присвоенному объекту моего нового класса?

class str_usr(str): 
     def __new__(cls, arg): 
      return str.__new__(cls, arg) 
     def dub(self): 
      # How to modify the string value in self ? 
      self.<attr> = self.<attr> + self.<attr> 

Спасибо за любую помощь :-)

ответ

3

Строки в Python неизменяемы, поэтому, если у вас есть одна строка, вы не можете изменить ее значение. Это почти то же самое, как если бы у вас был класс, полученный из int, а затем вы добавили метод для изменения значения int.

Вы, конечно, можете вернуть новое значение:

class str_usr(str): 
    def dup(self): 
     return self + self # or 2 * self 

s = str_usr("hi") 
print s # prints hi 
print s.dup() # print hihi 
+0

Спасибо, что ответил на мой вопрос. Однако, как от вашего ответа, так и от ответа Майка Грэхема, я вижу, что моя идея не была хорошим общим подходом. –

2

Это не выглядит, как вы хотите, чтобы наследовать от str вообще (что prettymuch никогда не полезно, так или иначе). Создайте новый класс и есть один из его атрибутов быть строкой вы получаете доступ, то есть

class MyString(object): 
    def __init__(self, string): 
     self.string = string 

    def dup(self): 
     self.string *= 2 

Кроме того, обратите внимание, об этом:

  • Имя ваши классы с CamelCaseCapitalization, чтобы люди могли понять, что они являются классами. str и некоторые другие встроенные функции не следуют этому, но все пользовательские классы пользователя.
  • Обычно вам не нужно определять __new__. Возможно, будет работать __init__. То, как вы определили __new__, не особенно полезно.
  • Чтобы добавить новую функциональность к строкам, вам, вероятно, не нужен класс; вы, вероятно, просто хотите определить функции, которые берут строки.
+0

Спасибо за обстоятельный ответ. –

0

Обратите внимание, что в Python вы могли бы просто использовать оператор умножения на строку:

>>> s = "foo" 
>>> s*2 
'foofoo' 
+0

Ах, я просто вижу, что Алок уже упомянул об этом ... Ну, я оставлю свой ответ в любом случае, чтобы подчеркнуть, что подкласс в этом случае является чрезмерным/обфускацией. – paprika

+0

Ваш ответ хорош, поскольку в нем упоминается, что OP, вероятно, не нуждается в подклассе. Однако мы не знаем, что он хочет делать с его подклассом. –

Смежные вопросы