Pythonのドット(.)はどんな意味があるのか?

675, 2023-06-05

目次

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のフレームワーク)ではModelobjectsというネームスペースを持たせています。

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()selfreturnしている点です。
こうするとメソッドチェインが可能になります。
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 ・)

あれ? ドットが足りないな



この記事のアンケートを送信する