Python でシングルトンパターンを実装する

生成されるクラスインスタンスを常に一つにするシングルトンパターンを Python で実装します。

Python は Java みたいに “private static” みたいな修飾ができないし、どこで初期化すればいいのかもちょっと考える必要があります。

そのまえに、もし Python のクラス変数とインスタンス変数がいまいち区別できないという方は、こちらの記事を先にご覧いただくことをおすすめします。

Continue reading →

Python のクラス変数とインスタンス変数の危ない関係

Python でクラス変数を書き換えると生成済みのインスタンス変数にビックリな影響を与えることを知ったので、それについて書き留めておきます。使ったのは Python 3.5 です。

class Sandwich:
    ham = 0

メンバに変数 ham を持つ Sandwitch クラスを用意しました。このクラスのインスタンスを生成します。

>>> sw = Sandwich()
>>> sw.ham # インスタンス変数
0

当然、インスタンス変数は初期化された値が入ります。ではクラス変数を別の値に書き換えるとどうなると思いますか?

>>> Sandwich.ham = 1 # クラス変数に別の値を代入

そうすると…

Continue reading →

WiFi NFC App を公開しました

tap-to-connect

WiFi 接続設定を NFC でやりとりする規格を Wi-Fi Alliance が策定していて、一部の Android スマートフォンでは既に何のアプリもインストールせず、かざすだけで WiFi 接続設定が終わるんですよ。わたしこれに感動しまして、ついては iPhone でもぜひほしいと思った次第です。で、作っちゃいましたので要点をまとめます。
Continue reading →

Pythonの辞書に dot notation でアクセスする

Javascript のハッシュマップはドット・ノーテーション ( dot notation )でアイテムにアクセスできますよね。でも Python の辞書ではそれができません。できたら便利だなーと考えていたらひらめいたので、 dict クラスを継承した dict2 クラスを作りました。

class dict2(dict): 
    def __init__(self, *args, **kwargs): 
        super().__init__(*args, **kwargs) 
        self.__dict__ = self 

コンストラクタ __init__() をオーバーライドして self.__dict__ に self を代入する行を加えました。ただそれだけです。

__dict__ はオブジェクトの書き込み可能なアトリビュートを格納するために使用される辞書またはその他のマッピングオブジェクトです。 self はまさに dict を継承したマッピングオブジェクトなので、アトリビュートを格納する __dict__ に self を代入すれば、ドット・ノーテーションでアトリビュートとして辞書のアイテムにアクセスできるようになるってわけです。

ピンとこなくても、とりあえず動作を見てみましょう。

Continue reading →