Python 3の組み込み関数を速攻理解しよう: オブジェクト/スコープ/モジュール/動的評価/入出力編:特集:タイニーレファレンス(1/3 ページ)
Python 3の組み込み関数のうち、オブジェクトやクラス、スコープ、コードの動的評価、ファイルや標準入出力を扱うものを取り上げる。
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)
どちらの関数も引数としてオブジェクトを渡す。以下に使用例を示す。
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)'
組み込み関数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
オブジェクトに関連する情報を取得する: id/hash/type
組み込み関数idとhashは、オブジェクトを識別するためのID値あるいはハッシュ値を取得する。組み込み関数typeは引数に渡したオブジェクトの型を取得する。以下に構文を示す。
hash(object)
id(object)
type(object)
組み込み関数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
なお、組み込み関数typeには引数を3つ持つバージョンもある。これはクラスを新規に生成するのに似ている。以下に例を示す。
# 型オブジェクトSampleの作成
Sample = type("Sample", (object, ), dict(name="insider.net"))
s = Sample()
print(s.name) # 出力結果: insider.net
このバージョンの組み込み関数typeには第1引数に型名を、第2引数にタプルの形で1つ以上の基底クラスを、第3引数に辞書の形でその属性を指定する。これにより第1引数に指定した名前の型オブジェクトが作成される。
Copyright© Digital Advantage Corp. All Rights Reserved.