2009年7月5日日曜日

メソッドの定義

Pythonのインスタンスメソッドの扱いはJavaと非常に似ていますが、宣言方法や作法がいくつか異なります。

例)Python
  • 宣言は"def"で行います。
  • メソッド名は全て小文字で記述し、単語の区切りにアンダースコアを使用するのが一般的なようです。
  • 戻り値の定義は必要ありません。
  • 第1引数は自分自身のインスタンスを示す"self"となります。

class Person:

__name = None

def get_name(self):
return self.__name

例)Java

public class Person {

private String name = null;

public String getName {
return this.name;
}
}

Javaと比較すると変数の宣言同様、戻り値の型定義をしないことに非常に違和感がありますね。この辺りがユルイというか、Javaの方が厳格だと言われる所以でしょう。

2 件のコメント:

  1. クラス直下の代入はアトリビュートの初期化ではないので注意。
    インスタンス初期化時に代入すべきです。
    1. class Person:
    2. def __init__(self):
    3. self.__name = None
    4.
    5. def get_name(self):
    6. return self.__name

    >>> class A(object):
    ... a = []
    ...
    >>> x = A()
    >>> y = A()
    >>> x.a
    []
    >>> y.a
    []
    >>> x.a.append('1')
    >>> x.a
    ['1']
    >>> y.a
    ['1']

    返信削除
  2. コメントありがとうございます。
    動作を確認したところ、確かにご指摘の振舞いになりました・・・Javaでいうクラス変数のような振舞いですね。
    ですが、下記のように配列ではなく単一変数(配列じゃない変数)の場合ですと、インスタンス変数として扱われました。
    同じ宣言の仕方なのに、なぜ振舞いが違うのか・・・ちょっと仕様の意図が理解できません。。。

    class Person:
      name = None

    x = Person()
    y = Person()

    x.name = "hoge"

    print x.name
    print y.name

    >> hoge
    >> None

    返信削除