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

2008-09-07

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

__init__()メソッド

「__init__()」という名前のメソッドを定義しておくと、インスタンスを生成したときに、自動的に呼び出されるよ。

>>> class MyClass:
...   def __init__(self):
...     print 'initialize...'
...
>>> x = MyClass()
initialize...
>>>

この例だと「例のための例」みたいな感じだけど、本当はインスタンス生成時に値を初期化したりとか、そういう用途に使うみたいだよ。

「__init__()」メソッドの定義のときに、引数をもっと増やすことも出来るよ。そうすると、クラスからインスタンスを生成するときに引数を指定して初期化とかに利用したりすることができるようになるよ。

>>> class Complex:
...   def __init__(self, realpart, imagpart):
...     self.r = realpart
...     self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
>>>
トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080907

2008-09-06

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

メソッド名とデータ属性名の名前空間は同一

Pythonではメソッド名とデータ属性名(変数名)とで名前空間が分かれていないから、メソッドと同じ名前のデータ属性に代入してしまうと、そのメソッドが壊されてしまうよ。

>>> class MyClass:
...   def f(self):
...     return 'Hello, world!'
...
>>> x = MyClass()
>>> x.f()
'Hello, world!'
>>> x.f = 12345
>>> x.f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> x.f
12345
>>>
トラックバック - http://python.g.hatena.ne.jp/muscovyduck/20080906

2008-09-05

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

インスタンスメソッド

前回ちょっと実験したけど、

>>> class MyClass:
...   '''A simple example class'''
...   i = 12345
...   def f(self):
...     return 'Hello, world!'
...
>>> x = MyClass()
>>> x.f
<bound method MyClass.f of <__main__.MyClass instance at 0x00C3AD28>>
>>> x.f()
'Hello, world!'
>>>

xに代入されているMyClassクラスのインスタンスオブジェクトは、fを関数のように呼び出せたけど、実はこのfで参照しているオブジェクトは、関数ではなく「メソッド」なんだよ。

「メソッドって何?」ということは、ここでは説明しないよ。簡単に言うと「あるオブジェクトに対して実施できる操作」のことだよ。

メソッドが通常の関数と異なるのは、メソッド定義の第一引数(上のメソッドfの定義だとself)に、そのインスタンスオブジェクト自身が自動的に渡されることだよ。だから、たとえば

>>> class MyClass:
...   '''A simple example class'''
...   i = 12345
...   def g(self):
...     return self.i + 1
...
>>> x = MyClass()
>>> x.g()
12346
>>>
>>> x.i = 3
>>> x.g()
4
>>> 

のような感じで、インスタンスオブジェクトのデータ属性(ここでは変数i)にメソッド定義内から参照することができるよ。

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

2008-09-04

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

インスタンス生成

「クラスオブジェクト」は「型」だから、その型の値(インスタンス)を生成することができるよ。クラスオブジェクトからインスタンスを生成するには、関数呼び出しのように

x = MyClass()

のようにするよ。

じゃあ、前回定義したMyClassのインスタンスを生成してみるよ。

>>> class MyClass:
...   '''A simple example class'''
...   i = 12345
...   def f(self):
...     return 'Hello, world!'
...
>>> x = MyClass()
>>> type(x)
<type 'instance'>

ありゃ、MyClassのインスタンスの型名は「instance」なんだね。

>>> x.i
12345
>>> x.__doc__
'A simple example class'
>>> x.f
<bound method MyClass.f of <__main__.MyClass instance at 0x00C3AD28>>
>>> x.f()
'Hello, world!'
>>>

インスタンスからも、クラスの属性が参照できるんだね。そして今度は関数f()もきちんと呼び出すことが出来たね。

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

2008-09-03

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

クラスオブジェクト

じゃあ、前回出てきた「クラスオブジェクト」を、class文を使って実際に作ってみよう!

>>> class MyClass:
...   '''A simple example class'''
...   i = 12345
...   def f(self):
...     return 'Hello, world!'
...
>>> type(MyClass)
<type 'classobj'>
>>> 

ちゃんと、MyClassという変数にクラスオブジェクト(classobj型の値)が代入されていることがわかるよね。

>>> MyClass.i
12345
>>> MyClass.f
<unbound method MyClass.f>
>>> MyClass.__doc__
'A simple example class'

そして、ちゃんと属性参照によってクラスオブジェクトの持つ値を参照できることも分かったよ。ドキュメント文字列は「__doc__」という属性名で参照することができるんだね。

関数fを、参照じゃなっくて呼び出してみるとどうなるかな?

>>> MyClass.f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with MyClass instance as first argu
ment (got nothing instead)
>>> 

ありゃ、エラーになっちゃったね。エラーになる理由は、またあとで勉強するよ。

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