5

JavaScript では、既存のプロトタイプ関数にトリム関数を追加するためにこれを行うことができます

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");

次に、これらの機能にアクセスするために、このようなことを行うことができます。

trimmed = myString.trim();

そして、あなたはトリミングされた弦を持っています。

Pythonでは、これを行うことで文字列のプロトタイプ関数をリストする方法を知っています:

print dir(myString)

しかし、Python でプロトタイプ関数を追加するにはどうすればよいでしょうか?

4

1 に答える 1

14

まず、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.replacerunicodebytesstrNSStringBSTRfindmmapstr

この種の「ダック タイピング」は、Python のやり方の中心です。オブジェクトの実際の型を気にする理由がコードにない場合は、気にする必要はありません。

于 2013-03-18T17:38:22.137 に答える