クラスに文字列を付与する方法は?
-
03-07-2019 - |
質問
1つの追加属性を持つ文字列が必要です。赤で印刷するか緑で印刷するかを考えてみましょう。
Subclassing(str)は不変であるため機能しません。値はわかりますが、迷惑な場合があります。
多重継承は役立ちますか?私はそれを使ったことはありません。
オブジェクトのみを継承し、self.value = strを使用すると、すべての文字列のメッセージ(ストリップなど)を自分で実装する必要があります。
または、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に精通していません。