96846


スライス記法を利用できるメソッドを自作したいです。  
クラスを作成し、__getitem__メソッドをオーバーライドすることで、  
スライス記法が利用できることが分かりました。  
__getitem__以外のメソッドの引数で、スライス記法を利用できるようにするには、  
どうしたらよいでしょうか？

my_list[1:2] ←これはできました。  
my_list.my_method[1:2] ←これができるようにしたいです。

[code]

    import typing as t
    
    
    class CustomList():
        def __init__(self, list: t.List[t.Any] = None):
            self.list = list or []
    
        def get_item(self, index: t.Union[int, slice]) -> t.List[int]:
            # 独自メソッド
            return self.list[index]
    
        def __getitem__(self, index: t.Union[int, slice]) -> t.List[int]:
            # 組み込み関数を追加
            return self.list[index]
    
    
    print('◇独自メソッドの呼び出し')
    custom_list = CustomList([11, 22, 33, 44])
    print(custom_list.get_item(1))
    # print(custom_list.get_item(1:2))  # ←SyntaxError: invalid syntaxが発生する。
    
    print('◇インデクサをオバーライドした場合')
    print(custom_list[1])
    print(custom_list[1:2])
    
[/code]

以下、実行結果です。

[code]

    ◇独自メソッドの呼び出し
    22
    ◇インデクサをオバーライドした場合
    22
    [22]
    
[/code]


CC BY-SA 4.0
2023-11-20T06:01:32.490
96844
2023-11-20T07:10:47.567
2023-11-20T07:10:47.567
59368
59368
question
python python3
スライス記法を利用できるメソッドを自作したい。


メソッドの呼び出しでは `instance.method(arg, ..)` の書式 (丸括弧) になり  
その中ではスライスは使えないはずです。

メソッドではなくデータのメンバーであれば(そしてそれが シーケンスオブジェクトであれば)可能

[code]

    class Cls:
        def __init__(self, list: t.List[t.Any] = None):
            self.list = list or []
        # self.list は publicなメンバーとする
    
    v = Cls([11, 22, 33, 44])
    print(v.list[1])
    print(v.list[1:2])
    
[/code]


CC BY-SA 4.0
2023-11-20T06:56:12.510
96846
2023-11-20T06:56:12.510
43025
96844
answer


※ `list` は組み込みクラスなので、変数名を `lst` に変更しています。

[code]

    import typing as t
    
    class CustomList():
        def __init__(self, lst: t.List[t.Any] = None):
            self.lst = lst or []
    
        @property
        def get_item(self):
            # 独自メソッド
            return self.lst
    
        def __getitem__(self, index: t.Union[int, slice]) -> t.List[int]:
            # オーバーライド
            return self.lst[index]
    
    
    print('◇独自メソッドの呼び出し')
    custom_list = CustomList([11, 22, 33, 44])
    print(custom_list.get_item[1])
    print(custom_list.get_item[1:2])
    
    print('◇インデクサをオバーライドした場合')
    print(custom_list[1])
    print(custom_list[1:2])
    
    # ◇独自メソッドの呼び出し
    # 22
    # [22]
    # ◇インデクサをオバーライドした場合
    # 22
    # [22]
    
[/code]


CC BY-SA 4.0
2023-11-20T06:58:08.803
96847
2023-11-20T06:58:08.803
47127
96844
answer


ありがとうございます。理解できました。  
（丸カッコと、鍵カッコをごっちゃにして考えていました。）

my_class[1:2] ←OK  
my_class.my_list[1:2] ←OK。my_listに__getitem__メソッドが実装されていればよい。  
my_class.my_method(1:2) ←NG。できない。


CC BY-SA 4.0
2023-11-20T07:08:59.350
96848
2023-11-20T07:08:59.350
59368
96844
answer