pythonでいろいろ

pythonをいじりながら気になったことをメモしていきます

モジュールの場所

これでちょっとハマりました。

モジュールの検索順番

シェルの環境変数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まで

インストール方法はたくさん記事になっているのでそちらで。

qiita.com

最近では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イメージ上とファイルのやり取りが直接できるので超便利。