47580


Pythonのクラスの勉強をしていてクラス継承で引っかかり苦戦しているのでお力を貸して頂けないでしょう？

[code]

    class Shape:
        squs = []
        def __init__(self, w, h):
            self.width = w
            self.height = h
            self.squs = squs
    
    class Square(Shape):
        def go_list(self):
            super().__init__(self)
            return self.squs.append(self.width)
    
    s1 = square(20, 20)
    print(s1.go_list())
    s2 = square(10, 10)
    print(s2.go_list())
    
[/code]

**結果が最初は[20]になって次に[20,10]になるようにしたいです。**

Shapeクラスで作ったリストsqusに継承させて使いたいのですが、うまく行きません。  
どのように変更したら良いでしょうか？


CC BY-SA 4.0
2018-08-17T05:02:27.553
47578
2018-08-17T09:43:50.377
2018-08-17T05:26:53.870
22565
22565
question
python python3
pythonのclass継承について

[code]

    class Shape:
        squs = []
        def __init__(self, w, h):
            self.width = w
            self.height = h
            self.squs = self.squs
    
    class Square(Shape):
        def __init__(self,w,h):
            super().__init__(w,h)
    
        def go_list(self):
            self.squs.append(self.width)
    
            return self.squs
    
    S1 = Square(20, 20)
    print(S1.go_list())
    S2 = Square(10, 10)
    print(S2.go_list())
    
[/code]

これでいかがでしょうか。

**解説**  
コメントにも書いた通り、若干のシンタックスエラーが発見されました。それを治したうえでなのですが、

**appendの落とし穴**  
一番大きなポイントは、`append`後の値をreturnで返してしまった事です。  
`append`メソッドの戻り値は、常に`None`となります。  
ですから、`append`した後のリストを戻り値として渡しましょう。  
**クラス変数**  
`squs`は、クラス変数として定義されていますが、これは例えば、  
`Shape.squs`として、クラスの名前.変数で参照可能な変数という意味です。  
インスタンスを生成しなくても参照できる。という意味です。しかし、インスタンス無しで参照できるといっても、どのクラスに属しているかを、頭につける必要があります。  
ですから、それを内部で参照するには、やはり、`self.squs`としなければならないようです。  
**継承後の__init__とsuper()**  
これは、継承前のクラスの初期化メソッドを実行するものです。  
継承前のクラス`Shape`は、引数として、`w`,`h`を渡しています。  
これがそもそもなければ、`self.width`,`self.height`に値を渡せませんから、  
`__init__(self,w,h)`として、`super()`の後に、`w`,`h`を値渡しするようにしています。


CC BY-SA 4.0
2018-08-17T05:16:52.707
47580
2018-08-17T05:33:58.013
2018-08-17T05:33:58.013
24284
24284
47578
answer


`squs` はクラスの属性なので、`Shape.squs.append(self.width)` にして、`def return_squs(self):`
を追加する で、どうでしょうか。

[code]

    class Shape:
        squs = []
        def __init__(self, w, h):
            self.width = w
            self.height = h
            Shape.squs.append(self.width)
        def return_squs(self):
            return Shape.squs
    
    class Square(Shape):
        def go_list(self):
            Shape().__init__(self)
    
    
    S1 = Square(20, 20)
    print(S1.return_squs())
    S2 = Square(10, 10)
    print(S2.return_squs())
    
[/code]


CC BY-SA 4.0
2018-08-17T05:47:24.120
47582
2018-08-17T09:43:50.377
2018-08-17T09:43:50.377
24284
29757
47578
answer