2013/01/24

Pythonのクラスの使い方

Pythonのクラスの使い方をご紹介します。

定義

クラスは「class [クラス名](継承したいクラス名):」という形で定義します。
class MyClass(ParentClass):
    """Myclass for ...
    """

    def __init__(self, name, x, y):
        self.name = name
        self.x = x
        self.y = y

    def getX(self):
        return self.x
この例でいうと
  • MyClass クラス名
  • ParentClass 継承したいクラス名
  • x アトリビュート
  • y アトリビュート
  • __init__ メソッド
  • getX メソッド
となります。

派生クラス、基底クラスということばを使うなら、MyClassが派生クラス、ParentClassが基底クラス、にあたります。ちなみに、ParentClassをこのように継承する場合は、MyClassの定義よりも前(上)の部分でParentClassを定義しておく必要があります。

基底クラスを指定しない場合は、()(かっこ)の中身に何も書かず「class MyClass()」とするか、「Object」という基本クラスを入れて「class MyClass(Object)」とします。

「def~」の部分はメソッドの定義です。インスタンスメソッドの第一引数は必ずself(そのインスタンス自身)を入れることになっています。

ここで定義されているふたつのメソッドのうち、getXは通常のメソッドですが、__init__ は元からその用途が決められている特殊メソッドです。__init__の場合はコンストラクタのふるまいを指定するメソッドになります。

インスタンスの生成

上の例のように__init__を定義した場合、インスタンスmc1は次のように生成します。
mc1 = MyClass('Voyager', 10, 5)

__init__の定義文に書かれている引数のうち、self以外の引数をすべて与えてあげます。この場合では
  • mc1.name に 'Voyager'
  • mc1.x に 10
  • mc1.y に 5
が格納されます。

「__init__」のほかにも、「__str__」、「__le__」などの特殊メソッドが数多く用意されており、公式ドキュメントの特殊メソッドについて説明したパートにまとめて紹介されています。

私はほとんど使ったことがないので馴染みがないのですが、インスタンスメソッドではなく「クラスメソッド」を定義したい場合は次のように書けばよいようです。
@classmethod
def f(cls, arg1, arg2, ...):
    ...
クラスメソッドに関する公式ドキュメントはこちらにあります。

最後に、「class MyClass(ParentClass):」の一行下にある「"""My Class for ...    """」という部分は、クラスの説明文を書くところです。一般に「docstring」と呼ばれ、「[クラス名].__docs__」に格納されます。今回の場合だと
print MyClass.__docs__
とすると、「My Class for ~」という文字列が表示されます。docstringについて詳しくは、PEP 257で解説されていますのでよろしければそちらをご覧ください。

0 件のコメント: