モジュールの場所
これでちょっとハマりました。
モジュールの検索順番
シェルの環境変数PYTHONPATH=
でパスを設定できます。調べるにはsys
をインポートしてsys.path
を使って調べます。
パス外のモジュールを読み込む
ディレクトリはピリオドです。なんと。メソッドみたい。
home\module\hoge.py
を読み込むようなときは以下のように書きます。
import home.module.hoge test = home.module.hoge()
もしくは
from home.module.hoge import bar test = bar()
__init__.py
まだ__init__.py
はよくわかってません。モジュールを階層化する場合にディレクトリに必要だということぐらいで。
Pythonのオブジェクト指向
自分はPerlやshなどのスクリプトやCの入り口程度は知って使って来ましたしたが、オブジェクト指向についてはCのポインタから逃げ出して以降、あまり調べず使わずにきました。 ですが、Pythonのソースを読んだり、他人のライブラリを使おうとすると、どうしても知って使える必要が出てきました。
そんな自分用のメモです。
オブジェクト指向の単語
よく分からないことはまず単語からよく分からないし、聞き覚えのない事ばかりなので、逐一メモしていきます。
カタカナ語が多くて、しかも毎回引っかかるので読み進めにくいんですよね。3D CADにおける「ソリッド」や「サーフェス」みたいな。、
構造体→クラス
オブジェクト指向は「データ」と「処理」をひとまとめにするもの。タプルや辞書と似てるが違う。大きく異なるのが参照と代入。
「変数名.データ名」で参照する。
構造体に関数をもたせたものといえる。
Pythonとしてはめずらしくデータ名の宣言が必要。クラスの名前とデータ名を宣言(def __init__
やself)する。
使い方
name = ClassName()
で、nameというインスタンスがClassNameクラスから作成される。
インスタンス
クラスから作られた実際のデータがインスタンス。「インスタンス名.データ名」でデータにアクセスできる。
メソッド
クラス内で定義された関数が「メソッド」。インスタンス内のデータを操作するなど。class宣言内で def 関数(self)で定義する。
「self.データ名」でクラス内の変数をメソッドが参照できる。
「インスタンス名.メソッド名()」でメソッドを呼び出す。(「定義された第一引数は呼び出しに利用されない」…なので、argumentsのエラーなどで一つ数が合わないときがある。selfで一つはすでに引数で与えているから?)
コンストラクタ
def __init__(self):
これもメソッドの一つで、インスタンス作成時に実行される。これがコンストラクタ。インスタンス作成時に引数で与えて初期化をするようにすると、特定のデータの初期化が忘れなくて良い・・・らしい。
実装の隠匿
「何を外に見せて、何を隠すか」がオブジェクト指向だと容易に実現できる。
クラス変数とインスタンス変数
スコープが関わってくる。クラスが同じならばインスタンス同士でもスコープが同じ。def __init__
外で定義したクラス変数は「クラス名.変数」で他インスタンスでもアクセスできる。
クラスの属性の確認
print (str(dir(instance)))
これでinstanceの属性一覧が分かる。「dir」で確認。
コンポジション
オブジェクトの階層構造。クラスが入れ子構造になる。
継承等はまた次回…。
VM起動からdockerまで
インストール方法はたくさん記事になっているのでそちらで。
最近ではboot2dockerではなくdocker-machineを使うのが正しいようです。
ここでは毎回自分がハマっていることをメモ書きします。
ログインするまで
Docker Quickstart TerminalかKitematic(Alpha)からVMを起動してターミナルでdockerのVMにログイン。 ここまではいい。
このあと、dockerのイメージを立ち上げようとすると毎回
docker: Error response from daemon: Conflict. The name "/hogehoge" is already in use by container cd...中略...2f. You have to remove (or rename) that container to be able to reuse that name..
と怒られる。ちゃんと前回終了してないから?
なので
docker restart cd...中略...2f
と以前のコンテナ名でリスタートさせるのがいい。
dockerイメージにログイン
docker exec -it hogehoge bash
これで慣れた環境で作業ができる。
windowsとは「-v」オプションでドライブ上のフォルダを共有してやるとdockerイメージ上とファイルのやり取りが直接できるので超便利。