18

タイトルをより適切に表現する方法が見つかりませんでした。お気軽に修正してください。

私はPythonにかなり慣れていないので、現在言語を試しています.すべての組み込み型を他のメンバーで拡張できないことに気付きました..たとえば、型にeachメソッドを追加したいのですが、それはlist不可能であること。効率的な理由からそのように設計されており、組み込み型のほとんどは C で実装されていることを認識しています。

この動作をオーバーライドすることがわかった理由の 1 つは、新しいクラスを定義することです。このクラスは拡張されますlistが、それ以外の場合は何もしません。次に、変数listをその新しいクラスに割り当てることができます。新しいリストをインスタンス化するたびに、元の型listを作成するために使用されるように、コンストラクターを使用します。list

class MyList(list):
    def each(self, func):
       for item in self:
           func(item)
list = MyList

my_list = list((1,2,3,4))
my_list.each(lambda x: print(x))

出力:

1
2
3
4

もちろん、構築された it 型を取得し、その型を拡張するクラスを返すメソッドを定義することで、アイデアを一般化できます。さらに、元listの変数を別の変数に保存して、アクセスを維持することもできます。

私が今直面している唯一の問題は、 alistをそのリテラル形式 (つまり[1,2,3,4]) でインスタンス化すると、元のリスト コンストラクターが引き続き使用されることです (または使用しますか?)。この動作を無効にする方法はありますか? 答えが「いいえ」の場合、ユーザーが組み込み型を拡張できるようにする他の方法を知っていますか? (javascript が組み込みのプロトタイプを拡張できるように)。

組み込みのこの制限 (メンバーを追加できない) が Python の欠点の 1 つであり、他のユーザー定義型と矛盾していると思います...全体的に、私はこの言語が大好きですが、なぜこれが起こるのか理解できません。制限は本当に必要です。

4

1 に答える 1