2009-05-04 32 views
6

我想要一個帶有一個額外屬性的字符串,讓我們說是否以紅色或綠色打印它。如何在我的課堂上提高字符串的性能?

子類化(str)不起作用,因爲它是不可變的。我看到了價值,但它可能令人討厭。

多重繼承有幫助嗎?我從來沒有使用過。

繼承對象並使用self.value = str意味着我必須自己實現所有字符串消息(如strip)。

還是有辦法轉發他們,像Ruby的missing_method?

我認爲使用實例索引的類級字典存儲顏色可以工作。太醜了?

回答

6

Str能,除非您使用的是很舊的Python版本,繼承例如:

>>> class A(str): 
... def __new__(cls, color, *args, **kwargs): 
...  newobj = str.__new__(cls, *args, **kwargs) 
...  newobj.color = color 
...  return newobj 
>>> a = A("#fff", "horse") 
>>> a.color 
'#fff' 
>>> a 
'horse' 
>>> a.startswith("h") 
True 
+3

這很好。但是你需要小心這種方法。如果你做了任何字符串操作(如title(),+,...),結果將是str而不是A. – 2009-05-04 16:59:17

+0

我的印象是,這不會起作用,因此是一個問題。原來,這是我的__new__中的一個程序錯誤,我誤解了Python的不足信息。 – Tobias 2009-05-04 21:57:56

2

也許一個自定義類包含一個字符串將是一個更好的方法。你真的需要將所有字符串方法傳遞給底層字符串嗎?爲什麼不通過屬性暴露字符串,並允許該類的消費者做任何他們想做的事情?

0

你需要所有字符串的方法,所以擴展字符串並添加額外的細節。那麼如果字符串是不可變的呢?讓你的課也不變。然後,無論如何你都在創建新的對象,所以你不會意外地認爲它是一個可變的對象。或者,如果Python有一個,則擴展一個可變的字符串變體。我對Python不熟悉,不知道這樣的結構是否存在。

2
import UserString 
class mystr(UserString.MutableString): 
    ... 

一般來說,最好使用一成不變的字符串其&子類,但如果你需要一個可變的一個本是獲取它的最簡單方法。

0

您可以嘗試使用PyPI中的stringlike模塊。這裏是an example