2009年6月30日火曜日

クラス定義

PythonにおいてもJava同様クラスを定義することが可能です。

例)Python
  • アクセス修飾子はありません。
  • Pythonでは "{", "}" は使用しませんので、クラス宣言の末尾は ":" となります。
  • クラス名の先頭文字はJava同様大文字ではじめるのが一般的なようです。
  • 属性をカプセル化する場合は属性名の先頭に "__"(アンダースコア2つ)を付与します。
class Person:
__name = None
__age = None

例)Java

public class Person {
private String name = null;
private short age = -1;
}

これだけを見てもPythonはコードが少なくシンプルですね。単純にコーディング量が少なくなります。もちろんJavaの方が制御が厳密で堅牢ではありますが。適材適所が大切ですね。

2009年6月29日月曜日

完全なカプセル化は行えない

Javaでインスタンス変数を隠蔽してカプセル化を行う場合は変数にprivate修飾子を指定します。
Pythonにおいては変数名の先頭に"__"とアンダーバーを2つ付けることで同様の意味を持たせることが可能です。

例)Python
下記classの変数"__name"にはアクセスできない。

class Person:
__name = "hoge"

p = Person()
print p.__name # <- AttributeError: Person instance has no attribute '__name'

実はこれ、内部的には変数が別名に置き換わって定義され、その別名を指定すると直接アクセスすることが可能なようです。
擬似的にprivateを実現させているものですが、実用上は問題ありませんね。

2009年6月28日日曜日

Pythonの変数には型がない

Pythonの変数には型がありません。Javaは厳格に型定義を行いますので、これがJavaとは大きく異なる要素の1つです。私はEclipseを利用しているので、Javaの場合は実装中に警告をしてくれますが、Pythonでは実行させるまで間違いに気づけません。正直私はまだ馴染めていません。

例)Python
こんな風に数字でも文字列でも配列でも何でも代入できてしまいます。

hoge = -99
hoge = "abc"
hoge = [1, 2, 3]

このため、長いロジック内部などにおいて新たな変数を定義したつもりでいても、すでに定義済みの変数名と重複させてしまうと代入として処理されてしまいバグの原因になってしまうので注意が必要です。