今回からオブジェクトと属性を……と思いましたが、いろいろとオブジェクトやその属性を確認するために使いたい関数や演算子なんかを先にまとめておこうと思います。
お付き合いいただけると嬉しいです。(´▽`;)
オブジェクトの型を調べたいときはtype()関数が便利です。
type_test.py
#!/usr/bin/env python
#cording:UTF-8a = 1024
print( "type( a ) =", type( a ) )
とプログラムすると、
console
type( a ) = <class 'int'>
と出力されます。
これは“aがint型のオブジェクトですよ”ということを示しています。
これでざっくりと引数に渡したオブジェクト(変数など)がどんなものなのかがわかります(今回は整数であることがわかります)。
では次に、dir()関数です。
dir()関数は引数に渡したオブジェクトの属性をリストで返してくれる関数です。(全てではない場合があるらしいのですが)
dir_test.py
#!/usr/bin/env python
#cording:UTF-8a = 1024
print( "dir( a ) =", dir( a ))
とプログラムすると、
console
dir( a ) = ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', (中略) ,'real', 'to_bytes']
と出力されます。
ちょっと長すぎたので省略してしまいましたが許してください。(´Д`;)
これはint型の属性を表しています。
‘__〇〇__‘の形で定義されている属性はそのクラスが持っている“関数“を示しています。
実際にここで示された’__dir__‘を“a.__dir__()“の形で実行することで”dir( a )“と同じ結果を示します。
そして‘real‘のように名前だけで定義されている属性はそのクラスが持つ“変数“を示しています。
しかし、これはかなり面白いですね。やりたいことリストが爆発します。(*´Д`)ハァハァ
それぞれどんな関数なのか調べてみると面白いと思います。
それ単独ではよくわからない動きをするものも多そうなので直接実行してもあまりよくわからないと思いますが、‘__doc__‘なんかは結構使えると思っています。
さて、異なるオブジェクトの同一性を調べたいと思ったときは、id()関数と演算子isが使えます。
id()関数は引数に渡したオブジェクトの識別子(メモリのアドレス?)を出力します。
==演算子は比較するオブジェクトの“値“が同じかどうかを判別しますが、is演算子は同じオブジェクトかどうかをオブジェクトのidで比較します。
id_is_test.py
#!/usr/bin/env python
#cording:UTF-8a = 1024
b = a
print( "a is b =", a is b)
print( "a == b =", a == b)
print( id( a ), id( b ), id( 1024 ) )a = a + 1
print( "a is b =", a is b)
print( "a == b =", a == b)
print( id( a ), id( b ), id( 1024 ) )
とプラグラムすると、
console
a is b = True
a == b = True
139900194310608 139900194310608 139900194310608
a is b = False
a == b = False
139900194310800 139900194310608 139900194310608
と出力されました。
数字は毎回変わりますが、最後のid( a )とid( b )の数値の差は何度か試しましたが常に一定でした。
==とisの違いは比較結果が同じなのでこの例ではあまりわかりませんが、1024という数値とa、bは同じidを示し、同じオブジェクトを示していることがわかります。
そして、aに1を足したものは値もオブジェクトも異なることがわかりました。
では値が同じでオブジェクトが異なる例を見てみましょう。
id_is_test2.py
#!/usr/bin/env python
#cording:UTF-8print( "dir( 1 ) is dir( 1 ) =", dir( 1 ) is dir( 1 ) )
print( "dir( 1 ) == dir( 1 ) =", dir( 1 ) == dir( 1 ) )
print( id( dir( 1 ) ), id( dir( 1 ) ) )
とプログラムすると、
console
dir( a ) is dir( a ) = False
dir( a ) == dir( a ) = True
139948877636672 139948878116032
と出力されました。
dir( a )の出力は長いので省略しましたが、同じ内容が出力されるのは予想できると思います。
実際に出力してみても異なる結果が出力されることはありませんでした。
そのため==演算子では2つのリスト内容を比較して同じ内容だったのでTrueが出力されました。
しかし、is演算子ではFalseが出力されていますね。
idを確認すると、異なっているidを示しているのがわかります。
つまり、dir()関数は毎回リストを作成し、異なるオブジェクトとして返しているということですね。
さて、id()関数やis演算子を使うことで同じオブジェクトかどうかを確認できることがわかりました。
そして==演算子も一緒に使えば値だけが同じなのか、オブジェクトも同じなのかまでわかります。
今回はここまでにします。
かなりマニアックな内容になってしまいましたね。
面白くなかったら申し訳ないです。(´・ω・`)
ですが、このブログでは今後もこんな感じの深みにハマった実験的プログラムとその結果を載せていきたいと思います。
少しでも面白いとか、興味がわいたという方がいらっしゃればとてもうれしく思います。(* ̄∇ ̄*)エヘヘ
ではまた~。(`・ω・´)ノ
カテゴリー:オブジェクト, 基礎文法