nounai.output(spaghetiThinking);

趣味と実益を兼ねて将棋プログラム(研究ツールなど)を作ってみたいと思う私の試行錯誤とか勉強したことを綴ってゆく予定です。 主目的はプログラミングの経験値稼ぎですが、コンピュータ将棋の製作も目指してみたいとも考えています。

Singletonの実装

だいぶうさんくさいけど実装してみた。欠陥コード。


Python歴が浅いので普通にコンストラクタ使ってSingletonになるようにする方法が思いつきませんでした。なのでSingletonオブジェクトの生成をクラスメソッドで行わせるような実装にしました。まあ本家のデザパタ本もそういう設計でしたしね。コードは以下。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Singleton:
        f=False
        
        @classmethod
        def GetInstance(cls):
                if(Singleton.f==False):
                        Singleton.f = True
                        Singleton.instance =  Singleton(singleton=True)
                        return Singleton.instance
                else:
                        return Singleton.instance

        def __init__(self, singleton=False):
                if(singleton==False):
                        raise Exception,"This class \"Singleton\" is Singleton"
                else:
                        pass

if __name__=="__main__":
        # Test
        a=Singleton.GetInstance()
        b=Singleton.GetInstance()
        print a==b
        a.x=1
        print b.x
        b.x = 2
        print a.x

Singletonのコンストラクタに隠しパラメータ的なものを導入してコンストラクタによるインスタンスの生成を制御しています。 当然ながら、この仕様ではコンストラクタのsingletonパラメータ、もしくはSingleton.fの存在を知っている人間はSingletonを破ることが可能です。ざっくり書いたのでコードには無駄な部分があると思います。その辺りはそのうち見直すかも、ということで。コンストラクタのsingletonパラメータについてはuuidgenなどを利用してランダム文字列を生成し、バレにくいパラメータ名をつけるなどの工夫はあります。が、根本的な解決にはなりません。よって、あくまで自分用コードとして利用するための実装です。

追記

Pythonにもprivateの概念はある、ということなので少なくともSingleton.fについてはその存在を隠すことが可能です。メンバがpribvateかどうかは命名規則によって決定され、「__(アンダースコア×2)で始まり、かつ__で終わらない名前」だそうです。以下のページは参考URLです。記述は関数についてですが。