2009-05-04 71 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