nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Pythonでモジュールをインポートするときの構文

はじめに

関数の定義と関数を利用する処理を同じファイルに記述すると、コード行数が膨大になります。

また、関数を再利用しにくいです。

そこで、関数の定義を別ファイルに分けて、関数の定義(モジュール)を読み込む(インポート)方法をとります。

使用するモジュール定義

今回は以下のモジュールを使用します

[dos.py]

class Dog:
    # property
    voice = "bow!"
    
    # method
    def bark(self):
        print(self.voice)

モジュールのインポート方法1

クラス名が必要です。

import health

import dogs

dog = dogs.Dog()

dog.bark()

モジュールのインポート方法2

普段はこちらを使用したほうがいいと思います。 クラス名が必要ありません。

from dogs import Dog

dog = Dog()

dog.bark()
class Dog:
    # property
    voice = "bow!"
    
    # method
    def bark(self):
        print(self.voice)

参考リンク

jupyterノートブックで、pandas_datareaderが見つからない問題の対処

エラーメッセージ

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-86720d1c88cc> in <module>()
      7 import matplotlib.pyplot as plt
      8 import numpy as np
----> 9 import pandas_datareader
     10 import sklearn
     11 import sklearn.linear_model

ModuleNotFoundError: No module named 'pandas_datareader'

対処方法

note.mu

C++17で便利そうな文法

構造化束縛

#include <iostream>
using namespace std;
int main(void){
  {
    int ar[] = {3, 1, 4};

    // 配列を分解する。
    // ar[0]がaに代入され、
    // ar[1]がbに代入され、
    // ar[2]がcに代入される。
    // 分解する要素数は、配列の要素数と同じであること
    auto [a, b, c] = ar;

    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
  }
  std::cout << std::endl;

  // 参照の例
  {
    int ar[] = {3, 1, 4};
    int (&rar)[3] = ar;
    auto [a, b, c] = rar;

    // ar[1]を値2に書き換える
    b = 2;

    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
  }
}

初期化構文

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int test = 2;
    
    if (int x = 2; x > test)
    {
        std::cout << "xは変数testより大きい" << std::endl;
    }
    else if (x == test)
    {
        std::cout << "xは変数testと同じ値" << std::endl;   
    }
    else
    {
        std::cout << "xは変数testより小さい" << std::endl;   
    }
    
        switch (int x = 2)
    {
        case 2:
            std::cout << "xの値は" << x << "です。" << std::endl;
            break;
            
        default:
            break;
    }
}

Pythonでプライベートメンバ変数をクラスに定義する [Python]

Pythonのプロパティを使う方法

Pythonでは、クラスのカプセル化を実現する際は、プロパティを用いるほうがいいと思います。

getter, setterを作ったとしても、使用者側がそれを使ってくれる保証がありません。(´;ω;`)

あまり良くない書き方 その3 getter/setter - Python学習講座

コード

class Car(object):
    def __init__(self, model=None):
        self.model = model

    def run(self):
        print('run')


class ToyotaCar(Car):
    def run(self):
        print('fast')


class TeslaCar(Car):
    def __init__(self, model="Model S", enable_run=False):
        # 親のinit関数を呼び出す
        super().__init__(model)
        # プライベートメンバ変数
        self.__enable_auto_run = enable_run

    @property
    def enable_auto_run(self):
        return self.__enable_auto_run

    @enable_auto_run.setter
    def enable_auto_run(self, is_enable):
        self.__enable_auto_run = is_enable

    def run(self):
        print('super fast')

    def auto_run(self):
        print('auto_run')

car = Car()
car.run()

print('########')

toyota_car = ToyotaCar('Lexus')
print(toyota_car.model)
toyota_car.run()

print('########')

# コンストラクタで、プライベートメンバ変数(__enable_auto_run)に対して、Falseの値をセットする
tesula_car = TeslaCar('Model_S', False)
print(tesula_car.enable_auto_run)

# Setterを通して、プライベートメンバ変数(__enable_auto_run)に対して、Trueの値をセットする
tesula_car.enable_auto_run = True
print(tesula_car.enable_auto_run)

出力イメージ

run
########
Lexus
fast
########
False
True

クラスのメソッドのオーバーライドとsuperによる親メソッドの呼び出し [Python]

クラスのメソッドのオーバーライドとsuperによる親メソッドの呼び出し

<コード>

class Car(object):
    def __init__(self, model=None):
        self.model = model

    def run(self):
        print('run')


class ToyotaCar(Car):
    def run(self):
        print('fast')


class TeslaCar(Car):
    def __init__(self, model="Model S", enable_run=False):
        # 親のinit関数を呼び出す
        super().__init__(model)
        self.enable_auto_run = enable_run

    def run(self):
        print('super fast')

    def auto_run(self):
        print('auto_run')


car = Car()
car.run()

print('########')

toyota_car = ToyotaCar('Lexus')
print(toyota_car.model)
toyota_car.run()

print('########')

tesula_car = TeslaCar('Model_S', True)
print(tesula_car.model)
print(tesula_car.enable_auto_run)
tesula_car.run()
tesula_car.auto_run()

<出力結果>

run
########
Lexus
fast
########
Model_S
True
super fast
auto_run

業務で作成する設計ドキュメント

はじめに

プロジェクトで作成する設計ドキュメントは、プロジェクトの計画や品質を守るためにも必須と考えています。
私が必要と考える設計ドキュメントを以下に記載しました。

設計ドキュメント

番号 項目 内容 備考 優先度
1 GQM 定量的にプロジェクトの目標(ゴール)を定義する手法 プロジェクトの目標(ゴール)があいまいになることを防ぐ
2 PFD プロセス(作業)と成果物を1枚の図に表すことで,
作業と成果物の連鎖を見えるようにする図表
図だけでなく定義書を同時に作成することにより,
より厳密な定義も同時に表現できる文書となる
3 USDM 要求と仕様を記述する1手法。ソフトウェア要求仕様を定義するときに用いる
4 クラス図 システムを構成するクラスとそれらの関係を表現する
5 コミュニケーション図 クラスやオブジェクト間の応答(相互作用)と関連の両方を表現する図
6 ステートマシン図 オブジェクトの状態遷移を表現する為の図 オブジェクトの状態が多数あるプログラムであれば有用
7 状態遷移表 UMLのステートマシン図の内容を表形式で表示したもの astah professionalであれば、プラグインを使用することで、ステートマシン図から自動生成可能
7 シーケンス図 クラスやオブジェクト間のやりとりを時間軸に沿って表現する図 極めてわかりにくい処理フローがあれば、作成すべき

語句紹介

  • GQM : Goal(目標), Question(質問), Metric(尺度)
  • PFD : Process Flow Diagram
  • USDM (Universal Specification Describing Manner)

特記事項

  • GQM
    • ユースケース図を用いて記載するとよいでしょう。
  • PFD

    • プロセス(作業)と成果物は、リスクの種類に応じて色分けすると効果的です
      • 自分達が作成する成果物
      • チーム外から受け取る成果物
      • リスクが高いことが予想される作業
  • USDM (Universal Specification Describing Manner)

    • 顧客仕様が複雑なときほど、効果が発生します
    • 自分はExcelファイルで作成しています
  • クラス図

    • 今後のソースコードの保守(バグ修正や機能拡張)を考えると、必ず作成すべきです。
  • コミュニケーション図

  • クラス間のデータの流れを一目でわかるため、レビューなどで役立つでしょう

  • シーケンス図

    • これ単体でレビューで説明するのは、難しいと思います。極めてわかりにくい処理フローがあれば、作成すべきと思います。
      • 各クラスの役割や各クラスが持つメンバメソッドなどを理解した上で読まないと理解できないため)

UMLツールについて

私は、astah professionalを使用しています。おすすめです。

便利な使用方法についてまとめていきます。

Astah Professionalの便利な点まとめ - nprogram’s blog