2010-02-16 40 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

謝謝,這回答了我的問題。但是,從你和麥克格雷姆斯的回答中,我可以看出我的想法不是一個好的一般方法。 – 2010-02-17 21:03:15

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

謝謝你的完整的答案。 – 2010-02-17 20:59:59

0

注意的是Python你可以只用乘法運算符的字符串:

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

啊,我只是看到Alok已經提到過這個......好吧,無論如何我會留下我的回答,強調在這種情況下,子類化是過度工程/混淆。 – paprika 2010-02-16 07:48:59

+0

你的答案很好,因爲它提到OP不需要子類化。不過,我們不知道他想要怎麼處理他的子類。 – 2010-02-16 07:50:38