home changes contents help options

009:メソッド呼び出し

関数の呼び出し

関数の呼び出し方法は

関数名(引数1, 引数2, 引数3, ・・・)

です。どのような引数を取れるかは関数によって異なるので、それぞれの関数のドキュメントやコードを確認してください。組み込み関数のドキュメントは http://www.python.jp/doc/release/lib/built-in-funcs.html にあります。

次のコードはリストなど、オブジェクトの長さを返す組み込み関数 len の使用例です。len は引数を1つだけとります。

a = [0, 1, 2]
b = len(a)
print b # 3 と出力される

次のコードは2つのオブジェクトの大きさを比較する組み込み関数 cmp の使用例です。cmp は引数を2つとります。引数を2つ以上指定するときは引数をカンマで区切って書きます。

a = cmp(1, 2)
print a # 1つめの引数のほうが小さいので -1 と表示される

次のコードはファイルを開く組み込み関数 open の使用例です。 open は、1つ、2つ、もしくは3つの引数をとります。このように指定してもしなくてもよい引数を持つ関数もあります。

a = open('foo.txt') # ファイル foo.txt を(読み込み用に)開く
b = open('bar.txt', 'w') # ファイル bar.txt を書き込み用に開く
c = open('baz.txt', 'r', 0) # ファイル baz を読み込みように開く、バッファを使用しない

次のコードはグローバル変数を管理しているグローバルシンボルテーブル辞書を返す組み込み関数 globals の使用例です。 globals は引数をとりません。この場合括弧の中には何も書く必要はありません。

table = globals()

メソッドの呼び出し

メソッドの呼び出しは次のように行います。

オブジェクト.メソッド名(引数1, 引数2, 引数3, ・・・)

引数の指定方法は関数と変わりません。

次のコードは文字列オブジェクトにおける、ある文字で分割するメソッド split の使用例です。

string = 'abcdefg'
splitted = string.split('d') # 'd' で分割
print splitted # ['abc', 'efg'] と表示する

キーワード引数

python では「キーワード引数」という仮引数名とセットになった引数が存在します。次の print2 関数を考えます。

def print2(a=1, b=2):
  print a
  print b 

print2(a='foo', b='bar')

ここで、 a='foo' や b='bar' がキーワード引数です。このキーワード引数形式による関数呼び出しは、引数が多い関数を呼ぶときの可読性向上、省略可能な引数が多い関数を呼ぶときの手間の削減に役立ちます。以下のコードはいずれも有効です。

print2('foo', 'bar') # 引数(固定引数)2つを与えた
print2(a='foo', b='bar') # キーワード引数 a, b を与えた。動作は変わらず
print2(b='bar', a='foo') # キーワード引数は関数定義時の仮引数の順序にとらわれることなく書くことができる

print2() # 引数を与えなかった。仮引数 a, b にはそれぞれ 1, 2 が入る
print2('foo') # 1つだけ引数を与えた。仮引数 a には 'foo'、 b にはデフォルト値 2 が入る
print2(a='foo') # キーワード引数 a だけを与えた。同上
print2(b='bar') # キーワード引数 b だけを与えた。この書き方ならば前の引数をも省略できる。仮引数 a にはデフォルト値 1 が入る

リスト・辞書のアンパックによる引数指定

引数として関数に渡したい値がリストに収まっている場合があります。

def print2(a=1, b=2):
  print a
  print b 
args = ['foo', 'bar']
print2(args[0], args[1])

これを次のように書くことができます。

print2(*args)

またキーワード引数として関数に渡したい値が辞書に収まっている場合、

kwargs = {'a': 'foo', 'b': 'bar'}
print2(a=kwargs['a'], b=kwargs['b'])

次のように書くことができます。

print2(**kwargs)

少し深入り、呼び出し可能オブジェクトについて

Python では関数もメソッドも「呼び出し可能オブジェクト」にすぎません。そして呼び出し可能オブジェクトとは __call__ という特殊な名前のメソッドを持っている、ただそれだけのオブジェクトです。つまり、次の2行は等価です。

呼び出し可能オブジェクト(引数・・・)
呼び出し可能オブジェクト.__call__(引数・・・)

組み込み関数 len による実例は次のようになります

a = [0, 1, 2]
print len(a) # 3 と表示
print len.__call__(a) # 3 と表示

__call__ メソッドを持つオブジェクトを自作する方法は通常のクラス定義となんら違いはありません。次のようになります。

class MyCallable(object):
  def __call__(self):
    print 'I am callable'
obj = MyCallable()
obj() # I am callable と表示される

なお、あるオブジェクトが呼び出し可能オブジェクトかどうかを判別するには、組み込み関数 callable を用いるのが最も簡単です。