Pyhton入門を読み終わりました
面白いと思ったのは2点。
1. for文にelse節を書ける
for文がbreakせずにループを完了すると、else節が実行されます。
for (key, value)i in items:
if key == "target"
print "found: " + value
break
else
print "not found"
集合から値を探すときに、見つからなかった場合を区別するためにフラグ変数を用意するのが他の言語では普通ですが、for文にelse節を加えることでこれを不要にしています。
これだけだと、小さい問題を解決するために言語に大きな変更を加えているようで気持ち悪いのですが、whileやtryにもelse節を書けるのでなんとか許容できそうな感じです。
2. __getattr__で委譲を簡単に記述できる
Barの機能をFooでも公開したいがFooはBarの一種ではないという場合、C++やJavaであればBarオブジェクトをFooのメンバにしてFooにBarオブジェクトへの委譲メソッドを書くのが普通です。
class Bar {
public:
Bar() {}
void doBar() {}
};
class Foo {
Bar* bar;
public:
Foo() : bar(new Bar()) {}
void doBar() {bar->doBar();}
};
委譲メソッドがdoBar()一個だけならいいですが、これが多くなると作るのも面倒な上、保守性が低下します。
Eclipseで等の統合環境では、委譲メソッドをGUIから一括で作れるようにしていたり、リファクタリング機能で保守性を確保していたりしますが、対症療法であることは否めません。
Pythonの場合、未定義の属性への参照をフックする特殊メソッド__getattr__()があり、これを利用することで委譲を簡単に書けます。
class Foo:
def __init__(self):
self.bar = Bar() # 移譲先のオブジェクト
def __getattr__(self, name):
return getattr(self.bar, name) # 属性nameに対する参照をbarに転送する
動的言語ならではの手法なので、C++やJava等の静的言語でそのまま真似ることはできないのですが、ヒントにはなります。
欲を言えば、継承と同じように宣言的に記述できるとなお良いのですが、それは静的言語の手法かも知れません。
- Category(s)
- 雑談
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/anaka/pyhton5165958030928aad307f7d42308f308a307e3057305f/tbping
Re:Pyhton入門を読み終わりました
interface ?