[Python] クラスとオブジェクト | ややこしい知識ポイントと復習 | マジックメソッド (特別なメソッド)

ヒント: 記事を作成した後、目次を自動的に生成できます。生成方法は、右側のヘルプドキュメントを参照してください。


序文

参考動画:動画

1.魔法の方法

まず、chatgpt のマジック メソッド (特殊メソッド) の説明を見てください。
Python のマジック メソッド (マジック メソッド) は、特殊メソッド (スペシャル メソッド) とも呼ばれ、クラス定義で **二重アンダースコア (__)** を使用するものもあります。囲い込み方式。これらのメソッドは、オブジェクトに対する特定の動作や操作を実装するために、Python インタープリターによって呼び出すことができます。
一般的に使用される Python のマジック メソッドをいくつか示します。

__init __(self, …):オブジェクトのプロパティを初期化するために使用されるコンストラクター。

__len __(self): オブジェクトの長さを返します

__getitem __ ( self, key): オブジェクト内の指定されたキーの値を返します。

setitem (self, key, value): オブジェクト内の指定されたキーの値を設定します。

…等

これらのマジック メソッドを使用すると、Python クラスのインスタンスが組み込み型のように動作できるため、カスタムの動作や操作を簡単に実装できます。
その中でもコンストラクターは最も古典的な特殊メソッドです

2. 施工方法

Python クラスのコンストラクターは __init__ メソッドで、オブジェクトのプロパティを初期化するために使用されます。クラスのインスタンスを作成すると、__init__ メソッドが自動的に呼び出され、新しく作成されたオブジェクトの初期プロパティ値が設定されます。__init__ メソッドには通常、新しく作成されたオブジェクト自体を参照するために使用されるパラメータ self が少なくとも 1 つ必要で、必要に応じて他のパラメータが追加されます。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Alice", 20)
print(p.name)  # 输出:Alice
print(p.age)  # 输出:20

上記のコードでは、__init__ メソッドが 2 つのパラメーター name と age を受け取る Person クラスを定義します。これらのパラメーターは、それぞれオブジェクトの name プロパティと age プロパティを初期化するために使用されます。Person オブジェクトを作成すると、__init__ メソッドが自動的に呼び出され、新しく作成されたオブジェクトの name プロパティと age プロパティを設定するために、name パラメータと age パラメータがメソッドに渡されます。最後に、オブジェクトのプロパティ値を出力して、オブジェクトが正しく初期化されたことを確認します。

3. __getitem__ メソッド

__getitem__ メソッドは、インデックス作成操作のための Python のマジック メソッドです。obj[key] などのオブジェクトに対してインデックス操作を実行すると、Python インタプリタは自動的にオブジェクトの __getitem__ メソッドを呼び出し、インデックス値キーをパラメータとして渡します。

class MyList:
    def __init__(self, data):
        self.data = data

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[0])  # 输出:1
print(my_list[2])  # 输出:3

通常の状況では、コードを実行すると、要素を印刷できないというエラーが報告されます。
ここに画像の説明を挿入

ただし、少し変更すると、リスト要素を保存するための特別なメソッド getitem がクラスに追加されます。

class MyList:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[0])  # 输出:1
print(my_list[2])  # 输出:3

ここに画像の説明を挿入

ディープ ラーニングを学習していたとき、常に疑問がありました。mydataset データセット オブジェクトが生成されるときに、__getitem___ は自動的に呼び出されますか?
__getitem__ メソッドは、オブジェクトの生成時に自動的に呼び出されるのではなく、データセット オブジェクト インデックスを通じてデータセット内の要素にアクセスするときに自動的に呼び出されます。つまり、dataset[0] などの添え字によってデータセット内の要素にアクセスする場合、 __getitem__ メソッドを呼び出してデータセット内の最初の要素を取得します。
データセットを使用する場合、通常、データセット オブジェクトは DataLoader クラスに渡され、その後 DataLoader を使用してデータセットが反復されます。反復プロセス中に、DataLoader は自動的に Dataset オブジェクトの __getitem__ メソッドを呼び出してデータセット内の要素を取得し、これらの要素をバッチで返します。

同様に、 __len__ は、オブジェクトの生成時に自動的に呼び出されません。

4 番目、__len__ メソッド

前のコードと直接似ています。

class MyDataset:
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        return self.data[index]

my_dataset = MyDataset([1, 2, 3, 4, 5])
print(len(my_dataset))  # 输出:5

結果:
ここに画像の説明を挿入

上記のコードでは、__len__ メソッドはデータ セット内のサンプル数を返し、__getitem__ メソッドはデータ セット内の 1 つのサンプルを取得するために使用されます。このように、DataLoader を使用してデータ セットを反復する場合、DataLoader は自動的に MyDataset オブジェクトの __len__ メソッドを呼び出してデータ セットの長さを取得し、反復プロセス中の反復数を決定します。

おすすめ

転載: blog.csdn.net/weixin_46274756/article/details/130162569