72555


Pythonのクラスはリストのように扱えるのでしょうか?`print(s)`でインスタンスオブジェクトが返されそうなのになぜでしょうか？
クラスの引数に`list`をするとこのような動作をするのでしょうか？

引用元:  
「独習Python」 P.423

>
[code]

>     class MyStack(list):
>       def push(self, elem):
>           self.append(elem)
>  
>     if __name__ == '__main__':
>       s = MyStack([10, 20, 30])
>       s.push(40)
>       print(s.pop())
>       print(s)
>  
>     # 実行結果
>     40
>     [10, 20, 30]
>  
[/code]


CC BY-SA 4.0
2020-12-09T05:04:20.417
72521
2020-12-10T05:57:07.130
2020-12-10T04:24:47.433
3060
22565
question
python python3
Pythonではクラスをリストのように扱えるのでしょうか？


> Pythonのクラスはリストのように扱えるのでしょうか?

MyStackはlistを継承したクラスなので、リストのように振る舞いますが、listを継承しなければリストのようには扱えません。

> print(s)でインスタンスオブジェクトが返されそうなのになぜでしょうか？

MyStackのインスタンスオブジェクトが返されています。  
type(s)を実行すると、返ってきたインスタンスのクラスがMyStackであることがわかります。

[code]

    <class '__main__.MyStack'>
    
[/code]

> クラスの引数にlistをするとこのような動作をするのでしょうか？

クラスを定義するとき、クラスの仮引数にクラスを指定するとそのクラスを継承し、継承元のクラスのようにふるまいます。  
MyStackはpushメソッドを追加したlistクラスといえます。


CC BY-SA 4.0
2020-12-09T07:17:40.867
72530
2020-12-10T05:57:07.130
2020-12-10T05:57:07.130
35558
35558
72521
answer


> クラスの引数にlistをするとこのような動作をするのでしょうか？

` class MyStack(list):` というコードと、` MyStack([10, 20, 30])`というコードは違う意味を持ってます。

` class MyStack(list):` の方はlistクラスを継承した「MyStack」というクラスの宣言です。  
これによりlistと同じふるまいをもったMyStackクラスが定義されます。

` MyStack([10, 20, 30])`の方は、MyStackクラスのインスタンスを生成しています。  
そのときにlistオブジェクトをMyStack生成時の引数に渡しています。これは継承元のlistで定義された振る舞いです。

以下はlistクラスの生成時(コンストラクタ)についての説明です。  
<https://docs.python.org/ja/3/library/stdtypes.html#lists>

> コンストラクタは、 iterable の項目と同じ項目で同じ順のリストを構築します。 iterable
> は、シーケンス、イテレートをサポートするコンテナ、またはイテレータオブジェクトです。 iterable が既にリストなら、 iterable[:]
> と同様にコピーが作られて返されます。

MyStackクラスはlistを継承しているので、同じようにコンストラクタの引数にlistを渡すことで、渡されたlistをコピーして生成されます。


CC BY-SA 4.0
2020-12-10T04:04:22.547
72555
2020-12-10T04:04:22.547
28626
72521
answer