2009-05-04 4 views
6

追加の属性が1つの文字列が必要です。それを赤または緑で印刷するかどうかを考えてみましょう。クラスに文字列を与える方法は?

サブクラス化(str)は不変であるため、機能しません。私は価値を見ますが、それは迷惑になることがあります。

複数の継承ヘルプを使用できますか?私はそれを使ったことはありません。

オブジェクトのみを継承し、self.value = strを使用すると、すべての文字列のメッセージ(ストリップのような)を自分で実装する必要があることを意味します。

Rubyのmissing_methodのように、転送する方法がありますか?

私は、インスタンスをインデックス化したクラスレベルの辞書を使用して色を保存できたと思います。あまりにも醜いです?

答えて

6

strが継承することができます。

>>> 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()、+、...)のような文字列演算を行った場合、結果はAではなくstr型になります。 –

+0

これは正しく動作しないという印象を受けました。私の__new__でpogrammingエラーであったことが分かり、Pythonの不適切なメッセージを誤解しました。 – Tobias

2

おそらく、に文字列が含まれているカスタムクラスは、より良いアプローチになります。すべての文字列メソッドを基になる文字列に渡す必要がありますか?なぜプロパティを介して文字列を公開し、クラスの消費者が望むものを何でもすることができますか?

0

文字列のすべてのメソッドが必要なので、文字列を拡張して追加の詳細を追加してください。文字列が不変の場合はどうなりますか?あなたのクラスも不変にしてください。とにかく新しいオブジェクトを作成しているので、変更可能なオブジェクトであると誤って思ってしまうことはありません。

または、Pythonに1つの文字列がある場合は、stringの可変変形を拡張します。このような構造が存在するかどうかを知るためにPythonにはなじみがありません。あなたは、たとえば、非常に古いPythonのバージョンを使用している場合を除き

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

それは、&サブクラス、その不変の文字列を使用することが一般的にベストですが、あなたが変更可能なものを必要とする場合は、このそれを取得する最も簡単な方法です。

+0

Python 2.2以降では非推奨になりました –

+0

UserStringクラスは2.2では廃止されましたが、MutableStringクラスは2.6では廃止されました。http://docs.python.org/library/userdict.htmlを参照してください。あなたは2.6以降を使用するつもりですが、可変バイト列は新しいバイト配列型(可変バイト配列)の上に実装できます。 –

0

PyPIstringlikeモジュールを試してみることができます。ここにはan exampleがあります。

関連する問題