Pythonの魔法関数

7371 ワード

1. call
Pythonでは、特殊なマジックメソッドcallがクラスのインスタンスの動作を関数のように表現することができます.クラスのインスタンスが関数のように呼び出されることを許可します.実質的には、x()とx._を意味する.call_()は同じです.注意callパラメータは可変です.これは、複数のパラメータがあってもcallを他の関数として定義できることを意味します.callは,それらのクラスのインスタンスが常に状態を変える場合に非常に有効である.このインスタンスを呼び出すのは、このオブジェクトの状態を変更する直接的で優雅な方法です.
class Entity:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __call__(self, x, y):
        self.x = x
        self.y = y


if __name == '__main__':
    someone = Entity(1, 2)
    #      someone.__call__(3, 4)
    someone(3, 4)
    print someone.x
    print someone.y

len()とgetitem()
カスタムコンテナを作成します.Pythonでは、一般的なコンテナタイプはdict,tuple,list,stringです.ここでtuple,stringは可変容器,dict,listは可変容器である.可変コンテナと可変コンテナの違いは、可変コンテナに値を割り当てると、その要素を変更することはできません.たとえばl=[1,2,3]とt=(1,2,3)を定義した場合、l[0]=0を実行することは可能ですが、t[0]=0を実行するとエラーが発生します.
上記のコンテナタイプと同じようにデータ構造をカスタマイズする場合は、いくつかのプロトコルを実装する必要があります.ここのプロトコルは他の言語のいわゆる「インタフェース」の概念と似ていて、あなたが実現しなければならないように、そんなに正式ではありません.
可変コンテナタイプをカスタマイズするには、_を定義するだけです.len_ および_getitem_方法;可変コンテナタイプをカスタマイズする場合は、可変コンテナタイプに基づいて定義を追加する必要があります.setitem_ および_delitem_. カスタムデータ構造で反復可能もサポートしたい場合は、定義が必要です.iter_.
可変コンテナの列:
import numpy as np

class My_Container():
    def __init__(self):
        data = np.random.randn(3, 2)

    def __len__(self):
        return self.data.shape[0]

    def __getitem__(self, item):
        sample = self.data[item, :]
        return sample


if __name__ == '__main__':
    contain = My_Container()
    print contain[0]


     :
[0.12, 0.63]

可変コンテナの列:
# -*- 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]

参考サイト
https://segmentfault.com/a/1190000007256392