0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

子クラスのプロパティやメソッドを定義した場合、親クラスの定義を上書きするわけではない

Last updated at Posted at 2020-09-20

これも、当たり前といえば当たり前・・・
しかし、気をつけてないと「あれ?」と思うことがあります。例えば、こういうクラスを考えます。

class A:
    prop1 = 123
    prop2 = prop1
    
    def hoge(self):
        return 'superhoge'
    
    fuga = hoge
    


class SubA(A):
    prop1 = 777
    
    def hoge(self):
        return 'hoge'

SubAのオブジェクトを生成すると、hoge()やprop1は当然こうなります。

>>> a = SubA()
>>> print(a.hoge())
hoge
>>> print(a.prop1)
777

ところで、prop2やfugaはどうなるでしょうか?
それぞれ、prop1とhogeを参照してるので、仮に上書きされるのであれば同じ結果になりそうです。
しかし、実際はこうなります。

>>> a = SubA()
>>> print(a.fuga())
superhoge
>>> print(a.prop2)
123

このことより、prop2やfugaが親クラスの定義を参照してることがわかります。
オブジェクト指向の仕組みとして、「子クラスで上書きする」という言い方がなされることがしばしばありますが間違っています。言葉の使い方には気をつけたほうが良いと思います。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?