我想要一个带有一个附加属性的字符串,让我们说是用红色还是绿色打印它。
Subclassing(str) 不起作用,因为它是不可变的。我看到了它的价值,但它可能很烦人。
多重继承有帮助吗?我从来没有用过那个。
仅继承对象并使用 self.value=str 意味着我必须自己实现所有字符串消息(如 strip)。
或者有没有办法转发它们,比如Ruby的missing_method?
我认为使用按实例索引的类级字典来存储颜色是可行的。太丑了?
我想要一个带有一个附加属性的字符串,让我们说是用红色还是绿色打印它。
Subclassing(str) 不起作用,因为它是不可变的。我看到了它的价值,但它可能很烦人。
多重继承有帮助吗?我从来没有用过那个。
仅继承对象并使用 self.value=str 意味着我必须自己实现所有字符串消息(如 strip)。
或者有没有办法转发它们,比如Ruby的missing_method?
我认为使用按实例索引的类级字典来存储颜色是可行的。太丑了?
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
import UserString
class mystr(UserString.MutableString):
...
通常最好使用不可变字符串及其子类,但如果您需要一个可变字符串,这是获得它的最简单方法。
也许包含字符串的自定义类会是更好的方法。您真的需要将所有字符串方法传递给底层字符串吗?为什么不通过属性公开字符串并允许类的消费者为所欲为呢?
您需要所有字符串的方法,因此扩展字符串并添加额外的详细信息。那么如果字符串是不可变的呢?也让你的类不可变。然后你无论如何都在创建新对象,这样你就不会意外地认为它是一个可变对象。
或者,如果 Python 有一个,扩展一个可变的字符串变体。我对 Python 不够熟悉,不知道是否存在这样的结构。