カスタムコンテナ(コンテナ)LOGIN

カスタムコンテナ(コンテナ)

前の章での紹介により、Python では一般的なコンテナ タイプが dict、tuple、list、string であることがわかりました。コンテナ化されたコンテナと不変コンテナの概念についても説明します。このうち、タプルと文字列は不変コンテナであり、辞書とリストは可変コンテナです。可変コンテナーと不変コンテナーの違いは、不変コンテナーに値が割り当てられると、その中の要素は変更できないことです。もちろん、詳しい紹介については、写真と文章を交えた前回の記事を読み返していただくことも可能です。

それでは最初に質問がありますが、これらのデータ構造は私たちが開発して使用するのに十分ですか?十分ではない場合、またはこれらの基本的なコンテナだけでは解決できない特別なニーズがある場合はどうすればよいでしょうか?

このとき、コンテナをカスタマイズする必要があるのですが、どうすればよいでしょうか?

を追加します #self[key] = valueを実行する場合#呼び出しは __setitem__(self, key, value) このメソッドですdel self[key] メソッドを実行する場合 #実際に呼び出されるメソッドは __delitem__(self, key)コンテナをコンテナ内の x に対して実行できるようにしたい場合: または iter(container)イテレータを返す __iter__(self) を実装する必要があります
関数説明
カスタム不変コンテナタイプ定義が必要_ _len__ および __getitem__メソッド
カスタマイズされた変数型コンテナ不変コンテナ型に基づいて定義 __setitem__ および __delitem__
カスタム データ型が必要です反復する必要があります __iter__ を定義する必要があります
カスタム コンテナの長さを返します 実装する必要があります_ _len__(self)
カスタム コンテナーは self[key] を呼び出すことができます。キーのタイプが間違っている場合、TypeError がスローされます。キーに対応する値を返せない場合、このメソッドは ValueError __getitem__(self, key) を実装する必要があります
上記の魔法のメソッドを使用して Haskell 言語でデータ構造を実装する方法を見てみましょう:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class FunctionalList:
    ''' 实现了内置类型list的功能,并丰富了一些其他方法: head, tail, init, last, drop, take'''
    def __init__(self, values=None):
        if values is None:
            self.values = []
        else:
            self.values = values
    def __len__(self):
        return len(self.values)
    def __getitem__(self, key):
        return self.values[key]
    def __setitem__(self, key, value):
        self.values[key] = value
    def __delitem__(self, key):
        del self.values[key]
    def __iter__(self):
        return iter(self.values)
    def __reversed__(self):
        return FunctionalList(reversed(self.values))
    def append(self, value):
        self.values.append(value)
    def head(self):
        # 获取第一个元素
        return self.values[0]
    def tail(self):
        # 获取第一个元素之后的所有元素
        return self.values[1:]
    def init(self):
        # 获取最后一个元素之前的所有元素
        return self.values[:-1]
    def last(self):
        # 获取最后一个元素
        return self.values[-1]
    def drop(self, n):
        # 获取所有元素,除了前N个
        return self.values[n:]
    def take(self, n):
        # 获取前N个元素
        return self.values[:n]


次のセクション

コースウェア