バリケンのPython日記 RSSフィード

2008-10-01

[] クラス(7)  クラス(7) - バリケンのPython日記 を含むブックマーク はてなブックマーク -  クラス(7) - バリケンのPython日記  クラス(7) - バリケンのPython日記 のブックマークコメント

メソッド定義

Pythonのクラスにメソッドを定義する場合は、通常の関数定義とは異なり特殊なルールに従う必要があるよ。

その特殊なルールとは、「第一引数に必ずselfを指定すること」だよ。そして、そのクラスのインスタンスを生成して実際にそのメソッドを呼び出すと、自動的にその第一引数インスタンスが代入された状態でメソッドが呼び出されるよ。なので、メソッド呼び出し時に与える引数は、メソッド定義の引数の数よりも一つ少なくなるよ。

あと前回ちょこっと触れたけど、__init__()メソッドという特別なメソッドがあるよ。このメソッドを定義しておくと、インスタンス生成時に自動的にこの __init__()メソッドが呼び出されるよ。なので、インスタンス変数初期化はこの__init__()メソッド内で実施するといいんじゃないかな。

説明を聞いてもピンと来ないから、実際にクラスを定義して、インスタンスを生成して、メソッドを呼び出してみよう!ここでは例として、インスタンス変数nameとageを持ち、sayメソッドで自己紹介をするクラスPersonを定義してみるよ。Pythonではクラスオブジェクトからインスタンスを生成するには、関数呼び出しのようにカッコをつけるよ。

class Person(object):
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def say(self):
    print 'My name is %s, I am %d years old.' % (self.name, self.age)

person = Person('Taro', 15)
person.say()

実行結果だよ。

My name is Taro, I am 15 years old.

おまけで、ほぼ等価なRubyコードを書いてみるよ。

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end
  attr_accessor :name, :age

  def say
    puts "My name is #{@name}, I am #{@age} years old."
  end
end

person = Person.new('Taro', 15)
person.say

Rubyが分かる人なら「なぜattr_accessorを指定しているの?」と疑問を持つかもしれないけど、それはまたこんど。

トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20081001