特集
» 2017年04月28日 05時00分 UPDATE

特集:タイニーレファレンス:Python 3の組み込み関数を速攻理解しよう: オブジェクト/スコープ/モジュール/動的評価/入出力編 (1/3)

Python 3の組み込み関数のうち、オブジェクトやクラス、スコープ、コードの動的評価、ファイルや標準入出力を扱うものを取り上げる。

[かわさきしんじ,Insider.NET編集部]
「特集:タイニーレファレンス」のインデックス

連載目次

 Python 3には多くの組み込み関数が用意されている。前回はオブジェクト生成/数値計算/文字や文字列/イテラブルに関連する組み込み関数を紹介した。今回は残りの組み込み関数の構文や使用例を紹介していこう。

ジャンル

 Python 3の組み込み関数はおおよそ次のようなジャンルに分類できる。

 後編となる今回は上記の分類のうち、下の4つのジャンルについて見ていくことにする。前回は、上の5つのジャンルに分類される組み込み関数を紹介しているので、必要に応じてそちらも参照していただければ幸いだ。

オブジェクトやクラスに関連するもの

 関数/クラス/オブジェクトに関連する組み込み関数としては次のものがある。

関数 説明
ascii 引数に渡したオブジェクトの文字列表現を取得する(非ASCII文字はエスケープされる)
callable 引数に渡したオブジェクトが呼び出し可能かどうかを調べる
classmethod クラスメソッドを定義する際にデコレータの形で記述する
delattr 第1引数に指定したオブジェクトから、第2引数に指定した名前の属性を削除する
getattr 第1引数に指定したオブジェクトから、第2引数に指定した名前の属性の値を取得する
hasattr 第1引数に指定したオブジェクトが、第2引数に指定した名前の属性を持つかを調べる
hash 引数に指定したオブジェクトのハッシュ値を取得する
id 引数に指定したオブジェクトの一意なIDを取得する
isinstance 第1引数に指定したオブジェクトが、第2引数に指定したクラス(またはその派生クラス)のインスタンスかどうかを調べる
issubclass 第1引数に指定したクラスが、第2引数に指定したクラスの派生クラスかどうかを調べる
property クラスにプロパティを実装するのに使用する
repr 引数に指定したオブジェクトの「オフィシャルな表現」(文字列表現)を取得する
setattr 第1引数に指定したオブジェクトに、第2引数/第3引数に指定した名前/値の属性を作成する
staticmethod 静的メソッドを定義する際にデコレータの形で記述する
super メソッド呼び出しをスーパークラスに委譲する際に使用する
type 引数に指定したオブジェクトの型を取得する
オブジェクトやクラスに関連する組み込み関数

 以下ではさらにこれらを幾つかのグループに分けて、その構文と簡単な利用例を示す。なお、省略可能な引数については「[]」で囲んで示す。

オブジェクトの文字列表現を取得する: ascii/repr

 組み込み関数asciiとreprは共に「印字可能な文字列表現」を返送する。ただし、前者は「非ascii文字をエスケープ処理したものが返送される」点が異なる。以下に構文を示す。

ascii(object)
repr(object)


組み込み関数ascii/reprの構文

 どちらの関数も引数としてオブジェクトを渡す。以下に使用例を示す。

s1 = "string"
s2 = "文字列"  # 非ASCII文字列を含む文字列

print(ascii(s1))  # 出力結果: "'string'"
print(repr(s1))   # 出力結果: "'string'"
print(ascii(s2))  # 出力結果: "'\\u6587\\u5b57\\u5217'"(エスケープされている)
print(repr(s2))   # 出力結果: "'文字列'"

class Foo:
  pass

print(ascii(Foo))  # 出力結果: "<class '__main__.Foo'>"
print(repr(Foo))   # 出力結果: "<class '__main__.Foo'>"

f = Foo()

print(ascii(f))  # 出力結果: '<__main__.Foo object at 0x00000124E2A0A2B0>'
print(repr(f))   # 出力結果: '<__main__.Foo object at 0x00000124E2A0A2B0>'

def fun():
  return "fun"

print(ascii(fun))  # 出力結果: '<function fun at 0x00000124E29EBAE8>'
print(repr(fun))   # 出力結果: '<function fun at 0x00000124E29EBAE8>'

print(ascii([1, 2, 3, 4]))  # 出力結果: '[1, 2, 3, 4]'
print(repr((1, 2, 3, 4)))   # 出力結果: '(1, 2, 3, 4)'


組み込み関数ascii/reprの使用例

 組み込み関数reprを呼び出すと、最終的にはそのオブジェクトが持つ__repr__メソッドが呼び出される。このメソッドは「オブジェクトのオフィシャルな表現」を返送する。「オフィシャルな表現」とはPythonのドキュメント「object.__repr__」の説明によれば、「(適切な環境が与えられれば) 同じ値のオブジェクトを再生成するのに使える、有効な Python 式のようなものであるべき」であり、それが無理であれば「<...some useful description...> 形式の文字列」を返送すべきとなっている。そのため、上のサンプルでは文字列やリスト、タプルについては前者の表現が得られ、関数やクラス、インスタンスについては「<...some useful description...>」形式の文字列が得られている。

 なお、自作のクラスでは__repr__メソッドを定義することで、組み込み関数repr呼び出し時の挙動をカスタマイズできる。以下に例を示す。

class Bar:
  def __init__(self, name=""):
    self.name = name
  def __repr__(self):
    return f"self.name: {self.name}"

bar = Bar("insider.net")
print(repr(bar))   # 出力結果: self.name: insider.net
print(ascii(bar))  # 出力結果: self.name: insider.net


__repr__メソッドを定義すると、組み込み関数reprの呼び出し結果が変わる

オブジェクトに関連する情報を取得する: id/hash/type

 組み込み関数idとhashは、オブジェクトを識別するためのID値あるいはハッシュ値を取得する。組み込み関数typeは引数に渡したオブジェクトの型を取得する。以下に構文を示す。

hash(object)
id(object)
type(object)


組み込み関数id/hash/typeの構文

 組み込み関数hashは、引数に渡したオブジェクトのハッシュ値(整数値)を返送する。ただし、リストや辞書などunhashable(ハッシュ不可能)なオブジェクトを渡した場合は例外が発生する。あるオブジェクトがハッシュ可能である場合、そのオブジェクトが生存している間、そのハッシュ値は不変であり、また2つのオブジェクトが同一であれば、それらのハッシュ値も等しくなる。ユーザー定義のクラスでは__hash__メソッドを定義することで、ハッシュ値の算出方法を変更できる。

 組み込み関数idは、引数に渡したオブジェクトを識別する値(ID)を返送する(PythonのC実装ではこれはオブジェクトのアドレスとなる)。あるオブジェクトが存在している間、そのオブジェクトのIDは一意に定まるが、そのオブジェクトが削除された後は、別のオブジェクトのIDが以前のオブジェクトのIDと等しくなる可能性はある。

 組み込み関数typeは、引数に渡したオブジェクトの型(型オブジェクト)を返送する。なお、Python 3のドキュメントでは型の判定には組み込み関数isinstanceの使用が推奨されている。

 これらの組み込み関数の使用例を以下に示す。

s = "string"

print(hash(s))     # 出力結果: 5883824401866579526
print(hex(id(s)))  # 出力結果: 0x124e290aa78

num1 = 100
num2 = 100.0

# 数値の場合、型によらず、同じ値であれば同じハッシュ値を持つ
print(hash(num1))     # 出力結果: 100
print(hash(num2))     # 出力結果: 100
print(hex(id(num1)))  # 出力結果: 0x6f07c630
print(hex(id(num2)))  # 出力結果: 0x124e27721c8

# リストはハッシュ不可能なので組み込み関数hushに渡すと例外が発生する
print(hash([1, 2, 3]))
# 出力結果:
# Traceback (most recent call last):
#   File "<stdin>", line 2, in <module>
# TypeError: unhashable type: 'list'

# リストはハッシュ可能なので組み込み関数hashに渡すとハッシュ値が返送される
print(hash((1, 2, 3)))  # 出力結果: 2528502973977326415

class Baz:
  pass

baz = Baz()

print(type(num1))  # 出力結果: <class 'int'>
print(type(baz))   # 出力結果: <class '__main__.Baz'>

# 組み込み関数isinstanceによる型判定(後述)
print(isinstance(baz, Baz))  # 出力結果: True


組み込み関数id/hash/typeの使用例

 なお、組み込み関数typeには引数を3つ持つバージョンもある。これはクラスを新規に生成するのに似ている。以下に例を示す。

# 型オブジェクトSampleの作成
Sample = type("Sample", (object, ), dict(name="insider.net"))
s = Sample()
print(s.name)  # 出力結果: insider.net


3引数バージョンの組み込み関数typeの使用例

 このバージョンの組み込み関数typeには第1引数に型名を、第2引数にタプルの形で1つ以上の基底クラスを、第3引数に辞書の形でその属性を指定する。これにより第1引数に指定した名前の型オブジェクトが作成される。

       1|2|3 次のページへ

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。