💩

【Python3】@propaty, setter, deleterはアクセスの仕方が異なる

2022/08/04に公開

変数を書き換える的な〜? という理解でしたが、コードを読んでいて深まりました。

普通の関数と同じようにアクセスすると、エラーが発生する。これは知りませんでした。

アクセスの仕方が大きく変わリます。

結論

# @propatyのfull_urlでurlを取得
# 実行を意味する「かっこ」が不要
request = Request(url="https://www.google.com/")
print(request.full_url) -> https://www.google.com/

× print(request.full_url()) -> ERROR!!!


# セッターを使用
# こちらも同様
request = Request(url="https://www.google.com/")
request.full_url = 'https://techacademy.jp/magazine/27217'
print(request.full_url) -> https://techacademy.jp/magazine/27217

× request.full_url(url="https://www.google.com/") -> ERROR!!!

# deleter
# del (~~) 
request = Request(url="https://www.google.com/")
del(request.full_url)
print(request.full_url) -> None

ソースコード

request.py
class Request:

    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):
        self.full_url = url
...

    @property
    def full_url(self):
        if self.fragment:
            return '{}#{}'.format(self._full_url, self.fragment)
        return self._full_url

    @full_url.setter
    def full_url(self, url):
        # unwrap('<URL:type://host/path>') --> 'type://host/path'
        self._full_url = unwrap(url)
        self._full_url, self.fragment = _splittag(self._full_url)
        self._parse()
	

   @full_url.deleter
    def full_url(self):
        self._full_url = None
        self.fragment = None
        self.selector = ''
...

Discussion