まず、Python には、JavaScript のようなプロトタイプ ベースのシステムではなく、クラス ベースのオブジェクト システムがあります。
メソッド (またはその他の属性) をクラスまたはインスタンスに追加するのは非常に簡単です。
FooClass.method = my_method
foo_instance.method = my_method
ただし、多くの「組み込み」型 (実際の組み込み型、および C 拡張で定義されているもの) では機能しません。そしてstr
、それらの1つです。
だから、あなたはこれを行うことはできません。
ただし、ほとんどすべてのタイプのサブクラスを作成するのは非常に簡単です。
class MyStringType(str):
def trim(self):
# your implementation here
__init__
おそらくカスタムメソッドが必要で、おそらくカスタム__new__
. また、 a を返すすべてのメソッドを、str
代わりに a を返すように変更してくださいMyStringType
。
それを行う別の方法は、委任を使用することです。
class MyStringType(object):
def __init__(self, *args, **kwargs):
self.s = str(*args, **kwargs)
def trim(self):
# your implementation here
str
このようにして、 から必要なすべてのメソッドを自動的に取得するのではなく、明示的に転送する必要があります。しかし、多くの場合、とにかくその方が良いです。__getattr__
特に、カスタムを実装するか、転送メソッドをプログラムで構築することで(クラス内__init__
またはクラス全体で)、どれだけ簡単に実行できるかを検討してください。
しかし、最も簡単な解決策は… やらないことです。パラメータtrim
を取る関数を持つことの何が問題になっていますか?str
そのようにすることの良い点は、trim
関数が任意の文字列のようなオブジェクトを取ることができることです。たとえば、 (コンパイルされた正規表現trim
のラッパーとして記述された) 関数は、 andの両方で動作します(一方は 2.x の同義語で、もう一方は 3.x の同義語です…しかし、両方を処理できる場合、それは機能しません)。関係ありません)、PyObjCラッパーまたは pywin32ラッパーなどを使用します。-type メソッドはリージョンでも機能します。でのみ動作するように制限するのはなぜですか?r.replace
r
unicode
bytes
str
NSString
BSTR
find
mmap
str
この種の「ダック タイピング」は、Python のやり方の中心です。オブジェクトの実際の型を気にする理由がコードにない場合は、気にする必要はありません。