サイトトップまとめドキュメントPythonオブジェクト指向プログラミングに関する例 ≫ クラス定義とインスタンスに関する操作の例

クラス定義とインスタンスに関する操作の例

例82 クラス定義とインスタンスに関する操作の例

[任意]ファイル名: simpleclass.py エンコーディング: UTF-8

#! /usr/bin/python
# -*- coding: utf-8 -*-

# シンプルなクラスのテスト

print ('シンプルなクラスのテスト')

import time
import sys
import os


# クラスはオブジェクト型という種類のデータ型の内部の仕様を定めたもの
# オブジェクト型は内部のデータ(メンバ変数)とそのデータに対する処理(メンバ関数)から成り
# クラスはその構成(データと処理の内容)を定義・記述する
#
# ここでは初期化時にファイルの場所を引数に受け取って内部のデータとして保持し
# メンバ関数でそれを用いてファイルの情報を取得するような型(クラス)を考える
class FileInfo:                   # クラス名
  """
  ファイル情報
  """
  # データ(メンバ変数)
  # Pythonでは最初に定義されていなくても「self.[メンバ名]」への代入時にメンバが新しく追加できるので
  # 実際は下の行はなくても動作はする
  filename = None
  # このクラスの型に基づく実際のデータ(インスタンス)が生成されるときに
  # 自動的に実行される処理を特殊なメンバ関数__init__()に記述する
  # __init__()は値を返さない(return文を書く場合は値Noneを返すようにする)
  #
  # メンバ関数が受け取る引数の最初の項目は「self」とし
  # 呼出時に受け取る引数をその後ろに記述
  def __init__ (self, filename):  # 引数を1つ受け取る
    """
    初期化時の処理
    """
    # 「self.[メンバ名]」でオブジェクト自身に含まれるメンバを参照できる
    # メンバ関数内からは「self」付きでアクセスする
    self.filename = filename      # 右辺のfilenameは受け取った引数のもの
  def get_filename (self):        # 引数は受け取らない
    """
    ファイル名を返す
    """
    # メンバ変数の内容をそのまま返す形はよく使われる
    return self.filename
  def get_mtime (self):
    """
    最終更新を取得して生の値を返す
    """
    return os.path.getmtime (self.filename)
  def get_mtime_str (self):
    """
    最終更新を取得して文字列形式で返す
    """
    # os.path.getmtime()の結果をtime.localtime()でタイムゾーンを考慮した(ローカル)時間にして
    # time.strftime()で「YYYY/MM/DD hh:mm:ss」形式の文字列にする
    return time.strftime ('%Y/%m/%d %H:%M:%S', time.localtime (os.path.getmtime (self.filename)))
  def get_size (self):
    """
    ファイルサイズを取得して返す
    """
    return os.path.getsize (self.filename)


# ここからメイン処理

# コマンド行引数の数をチェック
if len (sys.argv) < 2:
  print ('実行方法: {0} [入力ファイル]'.format (__file__))
  sys.exit (1)  # 戻り値1で実行を終了

infile = sys.argv[1]  # 引数をファイル名として使用

# 「[クラス名](([引数...]))」はそのクラスの型のオブジェクト(インスタンス)を生成してその参照を返す
# ここでは新しいFileInfo型オブジェクトを生成してその参照をオブジェクト変数iに入れている
# 渡す引数はクラスによって異なり、そのクラスの__init__()の引数に対応する
# この場合はFileInfoクラスが初期化時に1つの引数をとるため、それを渡している
i = FileInfo (infile)
try:
  # オブジェクトiのメンバ関数を「i.get_filename()」のようにして呼び出す
  print ('ファイル "{0}" のファイルサイズは {1}'.format (i.get_filename (), i.get_size ()))
  print ('ファイル "{0}" の最終更新は {1} ({2})'.format (i.get_filename (), i.get_mtime_str (), i.get_mtime ()))
except os.error as e:
  # エラーが起きたときにクラスの内部で呼ばれるメンバ関数から発生する通知(例外)を処理
  print ('エラーが発生しました: {0}'.format (e))

print ('終わり')

実行例:

(ファイルが存在する場合)
$ [simpleclass.pyの場所] /etc/debian_version
シンプルなクラスのテスト
ファイル "/etc/debian_version" のファイルサイズは 12
ファイル "/etc/debian_version" の最終更新は 2010/04/23 18:45:44 (1272015944.0)
終わり

(ファイルが存在しない場合)
$ [simpleclass.pyの場所] /etc/foo
シンプルなクラスのテスト
エラーが発生しました: [Errno 2] No such file or directory: '/etc/foo'
終わり

関連セクション