ケモインフォマティクスで学ぶPythonのクラス

# はじめに

[ケモインフォマティクスで学ぶPythonの関数](https://qiita.com/yukiya285/items/e3ea92fe0fc74a546325)に引き続き、リピドミクス（脂質の網羅解析）を題材として「クラス」について解説していきます。
ケモインフォマティクスの実践例を中心に説明していきますので、基本を確認したいという人は以下の記事を読んでからこの記事を読んでみてください。

[製薬企業研究者がPythonにおけるクラスについてまとめてみた](https://qiita.com/yukiya285/items/44292f850bc4f4dd24f1)


# クラスの作成と利用

クラスは、変数や関数をひとまとめに持っているオブジェクトのようなイメージです。
`class クラス名:`と書くことで作成することができます。
また、クラスから生成するインスタンス全てに共通する初期設定を記述するための「初期化メソッド」というものがあり、`__init__`を使って記述します。

```python
class FattyAcid:
    
    def __init__(self, c, u):
        self.Cn = c
        self.Un = u
        self.abbreviation = str(c) + ':' + str(u)
        self.exact_mass = 12 * c + 1.00783 * (2 * c - 2 * u) + 15.99491 * 2
        
        
    def describe(self):
        return f'The exact mass value of {self.abbreviation}　is {self.exact_mass}.'


palmitic_acid = FattyAcid(16, 0) # 「パルミチン酸」のインスタンスを生成
linoleic_acid = FattyAcid(18, 2) # 「リノール酸」のインスタンスを生成
 
print(palmitic_acid.Cn) # 16
print(palmitic_acid.Un) # 0
print(palmitic_acid.abbreviation) # 16:0
print(palmitic_acid.exact_mass) # 256.24238
print(palmitic_acid.describe()) # The exact mass value of 16:0　is 256.24238.

print(linoleic_acid.Cn) # 18
print(linoleic_acid.Un) # 2
print(linoleic_acid.abbreviation) # 18:2
print(linoleic_acid.exact_mass) # 280.24238
print(linoleic_acid.describe()) # The exact mass value of 18:2　is 280.24238.
```

上の例では、`FattyAcid`（脂肪酸）という「クラス」を定義し、そこから`palmitic_acid`（パルミチン酸）と`linoleic_acid`（リノール酸）という「インスタンス」を生成しています。
「クラス」はテンプレートのようなもので、「インスタンス」は具体例のようなもの、というイメージを持っておくと良いでしょう。
初期化メソッドの中には、炭素原子数や二重結合数、精密質量などを設定しており、インスタンスが生成された時に自動的に計算されるようになっています。
# クラスの継承

クラスには「継承」という概念があり、既存のクラスを「親クラス」として、親クラスに追加の機能を与えた「子クラス」を作ることができます。

```python
class FattyAcid:
    
    def __init__(self, c, u):
        self.Cn = c
        self.Un = u
        self.abbreviation = str(c) + ':' + str(u)
        self.exact_mass = 12 * c + 1.00783 * (2 * c - 2 * u) + 15.99491 * 2
        
        
    def describe(self):
        return f'The exact mass value of {self.abbreviation}　is {self.exact_mass}.'
        
        
class SaturatedFattyAcid(FattyAcid):
    
    def oxidize(self):
        return f'{self.abbreviation} cannot be oxidized. ' 
    
    
class UnsaturatedFattyAcid(FattyAcid):
    
    def oxidize(self):
        return f'{self.Un} double bond(s) can be oxidized. '
    

palmitic_acid = SaturatedFattyAcid(16, 0)
linoleic_acid = UnsaturatedFattyAcid(18, 2)

print(palmitic_acid.abbreviation)
print(palmitic_acid.describe())
print(palmitic_acid.oxidize())

print(linoleic_acid.abbreviation)
print(linoleic_acid.describe())
print(linoleic_acid.oxidize())
```

上の例では、`FattyAcid`（脂肪酸）という親クラスから、`SaturatedFattyAcid`（飽和脂肪酸）と`UnsaturatedFattyAcid`（不飽和脂肪酸）という子クラスを生成しています。
飽和脂肪酸は二重結合部分の酸化は受けませんが、不飽和脂肪酸は二重結合部分が酸化されるので、その違いを`oxidize`というメソッドで表現しています。
また、飽和脂肪酸か不飽和脂肪酸かに関わらず、`exact_mass`などは計算できるので、これらは親クラスである`FattyAcid`の初期化メソッドで設定しています。


# まとめ

ここでは、Pythonのクラスについて、ケモインフォマティクスで使える実践的な知識を中心に解説しました。
もう一度要点をおさらいしておきましょう。

- クラスは、変数や関数をひとまとめに持っているオブジェクトのようなものです。クラスをもとにインスタンスが生成されます。
- クラスは継承して子クラスを作ることもできます。

続いて、PythonのNumPyについて以下の記事で解説しています。

[ケモインフォマティクスで学ぶNumPy](https://qiita.com/yukiya285/items/ce8677ac6ac0f4842a02)

# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)