💩
【Python3】@propaty, setter, deleterはアクセスの仕方が異なる
変数を書き換える的な〜? という理解でしたが、コードを読んでいて深まりました。
普通の関数と同じようにアクセスすると、エラーが発生する。これは知りませんでした。
アクセスの仕方が大きく変わリます。
結論
# @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