2016/10/31

[py]はじめてのclass

pythonで何かするお仕事が止まっているので、ネタが切れかかっている。。。
えい、前回いっていた「文字列かbytearrayかを処理するだけのclass」を作ってみよう。

 

pythonにpublicやprivateというものを決めるキーワードは特になく、名前で決めるようだ。
でも、入門記事を見ていると、「こうだと思ってたんだけど」みたいな書き方で、言語仕様がどうなのか読んで書いているのかどうかわからんかった。
python2のドキュメントを読む。

  • __init__()は特別
    • コンストラクタ
  • プライベートな変数
    • 言語仕様としては無い
    • 慣習としてアンダースコアで始まる名前は、非publicとして扱う

 

python2.7で試す。

class StrBin:
name = ''

def __init__(self):
pass

def set_name(self, name):
self.name = name

def _hello(self):
print 'Hello, ' + self.name


sb = StrBin()
sb.set_name('yoshio')
sb._hello()

Hello, yoshio

 

pyCharmとしてはテキストエディタとして警告が出るものの、実行は問題ない。
当然、これもOKだ。

class StrBin:
_name = ''

def __init__(self):
pass

def set_name(self, name):
self._name = name

def _hello(self):
print 'Hello, ' + self._name


sb = StrBin()
sb._name = 'nitori'
sb._hello()
Hello, nitori

 

行儀はよくないだろうが、できる。


では、あっさりしたclassを作ってみよう。

class StrBin:
_value = ''
_type = -1 # 0:bytearray 1:string

def __init__(self):
pass

def set_bin(self, byte_array):
self._value = byte_array
self._type = 0

def set_str(self, string):
self._value = string
self._type = 1

def get_str(self):
if self._type == 0:
return self._value.encode('hex')
elif self._type == 1:
return self._value
else:
raise Exception('not set value')

def get_bin(self):
if self._type == 0:
return self._value
elif self._type == 1:
return self._value.decode('hex')
else:
raise Exception('not set value')

sb1 = StrBin()
sb1.set_str('ab12')
print 'get string: ' + sb1.get_str()

sb2 = StrBin()
val = b'\xab\x12'
sb2.set_bin(val)
print 'get bin: ' + sb2.get_str()

if val == sb1.get_bin():
print 'same !'
else:
print 'not same..'

 

まだソースコードをblogにうまく載せられないので、改行が消えてしまったようだ。。
ともかく、最初の代入で文字列かbytearrayかをちゃんと指定しておけば、あとはget_bin()なりget_str()なりで適切な方に変換してくれる。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。