Closed10

Python

DarmanDarman

for文とwhile文の使い分け

for文はリストの要素を逐一確認して、最後の要素まで繰り返すための構文。
while文は、ある条件が成立する間、処理を繰り返す構文。

for_sample.py
lst = [1, 2, 3, 4, 5]
for v in lst:
    print(v)
while_sample.py
v = 1
while v < 5:
    print(v)
    v += 1
print(v)

for文とwhile文を使い分けるコツは、繰り返す回数が決定できるのか否か。
繰り返し回数が決まっているのであれば、for文。
繰り返す回数はわからないけど終了条件は明確の場合は、while文を使う。

while文の条件は True 、 None以外のオブジェクト 、 ゼロ以外の数値 、 空文字(1文字もない状態)以外の文字列 、 空でないコンテナ(リスト、辞書、タプル) などの場合は継続する。
False 、 None 、 0 、 空文字 、 空のコンテナ などの場合は終了します。

DarmanDarman

breakとcontinueの違い

breakは処理を終了させる。
continueは処理をスキップさせる。

break_sample.py
arr = [1, 2, 3, 4, 5]
for v in arr:
    if v == 3:
        break
    print(v)

#  output-> 1, 2
continue_sample.py
arr = [1, 2, 3, 4, 5]
for v in arr:
    if v == 3:
        continue
    print(v)

#  output-> 1, 2, 4, 5
DarmanDarman

クラス変数とインスタンス変数

クラス変数

クラス自体が保持する変数
「クラス名.変数名」 で呼び出し

class_var.py
class Sample1:
    name = 'name' # クラス変数(クラス自体が保持する変数)
print(Sample1.name)  # name

インスタンス変数

オブジェクト固有の変数。データ属性ともいう。
「オブジェクト名.変数名」 で呼び出し(※クラス変数にもアクセス可)

instance_var.py
class Sample2:
    def __init__(self, value):
        self.value = value

s1 = Sample2('AAA')
s2 = Sample2('BBB')
print(s1.value)  # AAA
print(s2.value)  # BBB
DarmanDarman

ユーティリティークラス

よく使う関数群をまとめたクラスをユーティリティクラスという

クラス関数には2種類ある。

  • クラスメソッド
  • スタティックメソッド

関数の頭に@classmethodまたは@staticmethodのデコレーターをつけて使い分ける。

static_method.py
class TaxCalc:
    @classmethod
    def class_method(cls, price):
        assert cls.__name__ == TaxCalc.__name__
        return int(price * 0.1)

    @staticmethod
    def static_method(price):
        return int(price * 0.1)


print(TaxCalc.class_method(1000))
print(TaxCalc.static_method(1000))

クラスメソッドとスタティックメソッドの違い

クラスメソッドはメソッドのselfと同じで、第1引数にclsが格納される。
スタティックメソッドにはない。

使い分け

基本的には@staticmethodでOK。
クラスの情報が必要な場合や、派生クラスでオーバーライドする場合には@classmethodを使う。

DarmanDarman

publicとprivate

クラスが保持している変数や関数に対して、他のクラスのアクセスを制限できる。

sample.py
class Sample:
    num1 = 100
    __num2 = 200

    def __init__(self):
        self.__num3 = 300

    def show_num(self):
        print(Sample.__num2)
        print(self.__num3)


print(Sample.num1)
- print(Sample.__num2)  # AttributeError
s = Sample()
s.show_num()
- print(s.__num3)  # AttributeError

通常はpublicだが 「 __ 」を変数や、関数の頭につけるとprivateに変更できる。
privateはクラスの内部の関数しかアクセスできない。

※private変数は継承もできない。

DarmanDarman

継承(Inheritance)

クラスの情報(変数や関数)を引き継いで、新しいクラスを作成できる。
継承元、継承後のクラスをそれぞれスーパークラスサブクラスと呼ぶ。

inheritance.py
class A:
    def __init__(self):
        self.name = 'Class A'

class B(A):
    pass

b = B()
print(b.name)  # Class A

オーバーライド(override)

継承したクラスの関数はサブクラスでオーバーライド(上書き)することができる。
また、super関数で親クラスのオーバーライド前の関数にもアクセスできる。

※ super()が関数になっているのは、親→子→孫→ひ孫→玄孫という深い継承関係にあったときでも追えるようにするため。

override.py
class A:
    def hello(self):
        print('Class A says Hello')

class B(A):
    def hello(self):
        super().hello()
        print('Class B says Hello')

b = B()
b.hello()
# >>> Class A says Hello
# >>> Class B says Hello
このスクラップは2023/02/21にクローズされました