ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録

【PART5】Python勉強メモ

オブジェクト指向の4大要素

カプセル化

  • クラスに変数、メソッドを定義することで複数の要素をまとめて保持したオブジェクトを作成することができる
  • プライベート変数、プライベートメソッドを定義することで、クラス・オブジェクトの外から参照・実行することを防ぐ。外部との依存関係をなくし、疎結合な状態を作る。
    • pythonの場合、プライベート変数は存在しないが、名前付け規約として"_"から始まる変数やメソッドは外部からアクセスしてほしくないという意味。使う場合は自己責任。

抽象化

  • ある対象をモデル化(クラス定義?)するとき、すべての要素を含めるのではなく必要な要素のみを選ぶことで、抽象的に表現する。

ポリモーフィズム

  • 同じインターフェースを持ちながら、データ型にあわせて異なる動きをする機能。使い方が同じ。口で説明し図らいのでこんな感じ。
>>> type(1)
<class 'int'>
>>> type("hoge")
<class 'str'>

引数が異なっても同じ使い方。

>>> class Male:
... def __init__(self):
... pass
... def iam(self):
... print("I am male.\n")
...
>>> class Female:
... def __init__(self):
... pass
... def iam(self):
... print("I am female.\n")
...
>>> m = Male()
>>> f = Female()
>>> m.iam()
I am male.

>>> f.iam()
I am female.

データ型が異なっても同じ使い方。

継承

  • クラス定義する際、継承元(親クラス)を定義することで継承先(子クラス)は継承元の変数、メソッドを継承することができる。
  • 子クラスにおいて、親クラスで定義されたメソッドを再定義(メソッドオーバーライド)することで、親クラスと同じメソッド名で異なる実装ができる。

コンポジション

  • クラスにおいて、別のクラスのオブジェクトを変数として持すことができる。

チャレンジ

1

>>> class Rectangle:
... def __init__(self, x, y):
... self.x = x
... self.y = y
... def calculate_perimeter(self):
... return (self.x + self.y) * 2
...
>>> class Square:
... def __init__(self, x):
... self.x = x
... def calculate_perimeter(self):
... return self.x * 4
...
>>> r = Rectangle(4,5)
>>> s = Square(4)
>>> r.calculate_perimeter()
18
>>> s.calculate_perimeter()
16

2

>>> class Square:
... def __init__(self, x):
... self.x = x
... def calculate_perimeter(self):
... return self.x * 4
... def change_size(self, ch_x):
... self.x += ch_x
...
>>> s = Square(4)
>>> s.calculate_perimeter()
16
>>> s.change_size(2)
>>> s.calculate_perimeter()
24
>>> s.change_size(-2)
>>> s.calculate_perimeter()
16
>>>

3

>>> class Shape:
... def __init__(self):
... pass
... def what_am_i(self):
... print("I am a shape")
...
>>>
>>> class Rectangle(Shape):
... def __init__(self, x, y):
... self.x = x
... self.y = y
... def calculate_perimeter(self):
... return (self.x + self.y) * 2
...
>>> class Square(Shape):
... def __init__(self, x):
... self.x = x
... def calculate_perimeter(self):
... return self.x * 4
... def change_size(self, ch_x):
... self.x += ch_x
...
>>> r = Rectangle(3,3)
>>> s = Square(3)
>>> r.what_am_i()
I am a shape
>>> s.what_am_i()
I am a shape
>>>

4

>>> class Horse:
... def __init__(self,n,o):
... self.name = n
... self.owner = o
...
>>> class Rider:
... def __init__(self,n):
... self.name = n
...
>>> r = Rider("Yutaka")
>>> h = Horse("Uma",r)
>>> h.owner.name
'Yutaka'
>>> h.owner
<__main__.Rider object at 0x7fefcb6b5cf8>
>>>