Personal tools
You are here: Home ブログ nakayama Pyhton入門を読み終わりました
Document Actions

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入門を読み終わりました

Posted by Anonymous User at 2006-04-06 13:39
>欲を言えば、継承と同じように宣言的に記述できるとなお良いのですが、それは静的言語の手法かも知れません。

interface ?
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.