90664


継承を利用せずに、（例えばListやDictのインスタンスを包含して、）  
ListとDictと互換性のあるクラスを作成したいのですが、  
実装するべきメソッド（__から始まるメソッド）を教えていただけないでしょうか？

[code]

    class SampleList():
        def __init__(self):
            self.list = [1, 2, 3]
    
        def __iter__(self):  # イテレータの実装
            return (data for data in self.list)
    
    for value in SampleList():
        print(value)
    
[/code]

さらにスライスの実装も必要  
Len()の実装も必要  
他に必要なインターフェースありますでしょうか？  
Dictクラスについてはどうでしょうか？


CC BY-SA 4.0
2022-08-19T15:43:17.737
90637
2022-08-22T11:05:03.937
35267
question
python python3
継承を利用せずに、ListとDictと互換性のあるクラスを作成したい


`collections.abc`のドキュメントが参考になるはずです。

<https://docs.python.org/3/library/collections.abc.html>

組み込みクラスはこのモジュールで定義されるABCの「仮想サブクラス」である場合がある、と記載されています。実際に、`dict`は`MutableMapping`を、`list`は`MutableSequence`を仮想継承していることが確認できます。

[code]

    In [1]: from collections.abc import MutableMapping, MutableSequence
    
    In [2]: issubclass(dict, MutableMapping)
    Out[2]: True
    
    In [3]: issubclass(list, MutableSequence)
    Out[3]: True
    
[/code]


CC BY-SA 4.0
2022-08-20T14:43:58.957
90652
2022-08-20T14:43:58.957
36398
90637
answer


listやdictのメソッドの一覧を取得するのであれば、次のワンライナーで確認できると思います。

[code]

    # list
    (lambda x: print(*[s for s in dir(x) if callable(getattr(x, s))], sep='\n'))([])
    # dict
    (lambda x: print(*[s for s in dir(x) if callable(getattr(x, s))], sep='\n'))({})
    
[/code]

なお、「継承を利用せず」が「 **標準で継承されてしまうobject以外のあらゆるクラスからの** 継承を利用せず」ではなく「
**dictとlistからの**
継承を利用せず」と言う意味であれば、`collections.abc`にある抽象基底クラスを継承して、最低限必要なメソッドのみ実装し、他のメソッドはmixinによって自動定義したほうがいいでしょう。


CC BY-SA 4.0
2022-08-21T01:58:34.973
90664
2022-08-21T01:58:34.973
7347
90637
answer


ありがとうございます。  
おおむね理解できました。

<https://docs.python.org/3/library/collections.abc.html>より、継承関係を整理しました。

◇Listの継承関係  
MutableSequenceクラス継承し、  
以下の、赤字の５メソッドを実装すればよい、ことが分かりました。  
[![画像の説明をここに入力](https://i.stack.imgur.com/6d5I5.png)](https://i.stack.imgur.com/6d5I5.png)

◇Dictの継承関係  
「MutableMappingクラスを継承し、  
以下の、赤字の５メソッドを実装すればよい、ことが分かりました。  
[![画像の説明をここに入力](https://i.stack.imgur.com/SXc6A.png)](https://i.stack.imgur.com/SXc6A.png)

これで、コレクションの自作ができそうです。  
実際にやってみて、応用していきます。  
ありがとうございました。


CC BY-SA 4.0
2022-08-22T11:05:03.937
90697
2022-08-22T11:05:03.937
35267
90637
answer