忍者ブログ
趣味と実益を兼ねて将棋のプログラムを作ってみたいなと思っている私の試行錯誤や勉強したことを綴ってゆく予定です。 一番の目的はソフトウェア設計やオブジェクト指向に慣れること ・・・だったのですが、元々の興味や電王戦に触発されたこともあり、AI製作も目指してみたいと今は考えています。 ※はてなに移転しました。
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
プロフィール
HN:
cwron
性別:
男性
自己紹介:
将棋の腕前はムラがあるのでなんとも言えませんが、将棋ウォーズや81Dojo基準だと約三段てことになってます。リアルで指す機会が希少です。
Share
ブログ内検索
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

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


拍手[0回]

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です。記述は関数についてですが。

PR
お名前
タイトル
文字色
URL
コメント
パスワード
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Copyright © nounai.output(spaghetiThinking); All Rights Reserved
Powered by ニンジャブログ  Designed by ピンキー・ローン・ピッグ
忍者ブログ / [PR]