Pythonのドット(.)はどんな意味があるのか?
目次
Pythonのドットの意味
Pythonにおけるドット(.
)はオブジェクトの変数やメソッドにアクセスするための記号です。
たてば以下のようなクラスがあるとします。
class Pasokon: def __init__(self): self.disk = 'hdd' def poweron(self): print('起動しました!')
このパソコンクラスをオブジェクトにします。
そしてオブジェクトの変数やメソッドにドットでアクセスします。
pasokon = Pasokon() # クラスからオブジェクトを作る print(pasokon.disk) # ドットを付けてインスタンス変数にアクセス pasokon.poweron() # ドットを付けてメソッドを呼び出す
またドットはネームスペースを辿るのにも使われます。
import os os.path.abspath('path/to/folder')
ドットの構造
ドットは以下のような構造で表すことができるでしょう。
オブジェクト + ドット + 変数 オブジェクト + ドット + メソッド オブジェクト + ドット + オブジェクト
オブジェクトの中に変数やメソッドが定義されていたらPythonではオブジェクトにドットを付けてその変数やメソッドにアクセスできます。
またオブジェクトが別のオブジェクトを持っていたらドットでそのオブジェクトにアクセス可能です。
要はドットはオブジェクトの中身を参照するための記号、と言うことができます。
リストのデータにドットでアクセスできるか?
リストが持つデータにドットでアクセスすることはできません。
l = [1, 2, 3] print(l.0) # X
データにアクセスするには角かっこを使って添え字でアクセスします。
l = [1, 2, 3] print(l[0]) # 1
しかしリストが持つメソッドにはドットでアクセスできます。
l = [1, 2, 3] print(l.pop()) # 3
辞書のデータにドットでアクセスできるか?
辞書が持つデータにドットでアクセスすることはできません。
d = { 'age': 20 } print(d.age) # X
データにアクセスするにはリストと同様に角かっこで添え字アクセスします。
d = { 'age': 20 } print(d['age'])
しかし辞書が持つメソッドにはドットでアクセスできます。
d = { 'age': 20 } print(d.items())
ネームスペースを繋げていくにはどうしたらいいか?
ドットで辿れるネームスペースを繋げていきたい場合はクラスを使います。
class aaa: class bbb: class ccc: ddd = 1 print(aaa.bbb.ccc.ddd) # 1
上記のようにクラスを入れ子にすればドットで辿れるネームスペースを繋げていくことができます。
たとえばDjango(Pythonのフレームワーク)ではModel
にobjects
というネームスペースを持たせています。
Article.objects.filter(title='my article').all()
上のコードはArticle
というモデルのオブジェクトをフィルターしてすべて取得しているところです。
ドットを使ったメソッドチェインはどうやって書くの?
メソッドチェインというのはメソッドをドットで繋げてチェイン(鎖)のように処理を実行していくテクニックです。
このテクニックを積極的に採用している言語としてはRustなどが挙げられます。
メソッドチェインのサンプルとしては以下のようなコードが考えられます。
class Article: def filter(self): return self def all(self): return [1, 2, 3] article = Article() print(article.filter().all()) # [1, 2, 3]
上記のコードでポイントなのがfilter()
でself
をreturn
している点です。
こうするとメソッドチェインが可能になります。
filter()
を呼び出した後は再びArticle
のオブジェクト(self
)にアクセスできるので、そこからさらにall()
を呼び出しています。
filter()
でオブジェクトの状態を変える。たとえばインスタンス変数の値を変更するなどして、all()
でその変更結果から結果を返す、という感じにすれば実用的なメソッドチェインができます。
たとえば以下のようにです。
class Article: def __init__(self): self.lower = False self.upper = False self.data = 'Cat' def filter(self, lower=False, upper=False): self.lower = lower self.upper = upper return self def get(self): if self.lower: return self.data.lower() elif self.upper: return self.data.upper() else: return self.data article = Article() print(article.filter().get()) # Cat print(article.filter(lower=True).get()) # cat print(article.filter(upper=True).get()) # CAT
上記のコードではfilter()
でフラグを立てて、get()
の中でそのフラグに応じて返す値を加工しています。
このようにすればメソッドチェインを使ったクラスを構築できます。
おわりに
今回はPythonのドットの意味について解説しました。
なにか参考になれば幸いです。
(^ _ ^) | ドットが1つ、ドットが2つ・・・ |
(・ v ・) | あれ? ドットが足りないな |