TensorFlowやChainerに興味があるけど、Python未経験の技術者が最低限知っておいた方がいい基礎文法まとめ:特集:タイニーレファレンス(6/6 ページ)
Python 3の基本となる構文要素や、データ型の使い方、関数とクラスの定義方法を構文やサンプルコード多めでギュッと濃縮。
クラス
Python 3ではクラスを利用したオブジェクト指向プログラミングも可能だ。クラス定義の構文を以下に示す。
# クラス定義
class クラス名(ベースクラス):
クラス変数名 = ... # クラス変数の定義
def __init__(self[, パラメーターリスト]): # インスタンスの初期化
self.インスタンス変数名 = ... # インスタンス変数の初期化
def インスタンスメソッド名(self, [パラメーターリスト]):
ブロック
@classmethod # クラスメソッドは「@classmethod」で修飾する
def クラスメソッド名(cls[, パラメーターリスト]):
ブロック
@staticmethod # スタティックメソッドは「@staticmethod」で修飾する
def スタティックメソッド名([パラメーターリスト]):
ブロック
クラス変数はclassキーワードを記述した直下のブロックで定義する。インスタンス作成時にメンバを初期化するには、__init__メソッドを使用する。また、インスタンスメソッドはその呼び出し時に暗黙の第1引数としてインスタンス(self)が渡される。__init__メソッドやインスタンスメソッドではこれを利用して、インスタンス変数にアクセスを行う。
@classmethodで修飾されたメソッドはクラスメソッドとなる。@staticmethodで修飾されたメソッドはスタティックメソッドとなる。前者は呼び出し時に暗黙の第1引数としてクラスが渡されるが、後者ではクラスに関する情報は渡されないのが、両者の大きな違いとなる。スタティックメソッドはクラスに関連するが、クラス情報やインスタンス情報を必要としない処理を記述するのに使える。
以下にクラスの定義例を示す。
class MyClass:
clsvar = "class var"
def __init__(self, foo="foo", bar="bar"):
self.foo = foo
self.bar = bar
def instance_method(self):
print(self.foo, self.bar)
@classmethod
def cls_method(cls):
print(str(cls))
@staticmethod
def static_method():
print("static method")
# クラス変数にはクラス経由でアクセスできる
print(MyClass.clsvar) # 出力結果: class var
c = MyClass() # クラスのインスタンス作成(newは不要)
# インスタンスメソッド呼び出し
c.instance_method() # 出力結果: foo bar
# クラスメソッド呼び出し
MyClass.cls_method() # 出力結果: <class '__main__.MyClass'>
# スタティックメソッド呼び出し
MyClass.static_method() # 出力結果: static method
モジュールのインポート
Pythonには多くのモジュールを利用できる。ただし、組み込みの型や関数以外のものは、使用する前にそれらを「インポート」する必要がある。これにはimport文を利用する。import文の構文を以下に示す。モジュールを丸ごとインポートした場合には、そのモジュールが公開しているメンバにアクセスするには「モジュール名.メンバ名」と記述する。個別にメンバをインポートした場合には、メンバ名を利用してそれにアクセスできる。
# 単純なインポート
import モジュール名
# モジュールからインポートするものを指定
from モジュール名 import インポートするもの
# 別名を付けてインポート
import モジュール名 as 別名
# インポートするものを指定して、別名を付ける
from モジュール名 import インポートするもの as 別名
複数のモジュール/モジュールのメンバをインポートするには、それらをカンマで区切って指定すればよい。以下に例を示す。
# randomモジュールをインポート
import random
# randomモジュールが公開している関数randintを呼び出す
print(random.randint(1, 10)) # 出力結果(例): 1
# osモジュールが公開している関数getcwdをインポート
from os import getcwd
print(getcwd()) # 出力結果(例): C:\Users\insidernet\py3tinyref_01\src
# sysモジュールをsystemとしてインポート
import sys as system
print(system.version) # 出力結果(例): 3.5.2 |Anaconda 4.1.1 (64-bit)| …… 省略 ……]
# datetimeモジュールのdateクラスをDとしてインポート
from datetime import date as Date
d = Date(2016, 10, 31)
print(d) # 出力結果: 2016-10-31
# randomモジュールから関数randintと関数choiceをインポート
from random import randint, choice
print(choice(list(range(10)))) # 出力結果(例): 5
また、クラスや関数などを別ファイルに記述し、Pythonプロジェクトを複数のファイルで構成した場合も同様にimport文でそれらの内容をインポートできる。以下のようなPythonスクリプト「mylib.py」があったとする。
def fact(n):
print("fact:" + str(n))
def sum(n):
print("sum:", n)
def fib(n):
print("fib:", str(n))
これが同じディレクトリにある場合には「import mylib」でその内容をインポートできる。
import mylib # mylibモジュールをインポート
mylib.sum(100) # mylibモジュールの関数sumを呼び出す
複数のファイル/ディレクトリで構成される「パッケージ」を作成するには、パッケージを構成するディレクトリの全てに__init__.pyファイルを作成する。例えば、次の画像のようなディレクトリ/ファイル構成の「パッケージ」があったとする(背景色が水色の四角がディレクトリを、白地の四角がファイルを表す)。特に構成が必要なければ、__init__.pyファイルの内容は空でよい。これはmypackageパッケージが2つのモジュールmodule1とmodule2で構成され、それぞれのモジュールにはfoo.pyファイルとbar.pyファイルが含まれていることを意味する。
パッケージの内容をインポートするには「パッケージ名.モジュール名.ファイル名」のように構成要素を連ねていく。例えば、このパッケージの内容をインポートするには、次のようにする。
import mypackage.module1.foo as foo
import mypackage.module2.bar as bar
foo.foofunc()
bar.barfunc()
今回はPython 3の基本といえる各種のデータ型と制御構造、関数定義、クラス定義について、その構文とサンプルコードにまとめた。次回はPython 3の組み込み関数などについて、その構文や使い方をまとめてお届けする予定だ。
Copyright© Digital Advantage Corp. All Rights Reserved.