ちょっと興味があるんだけど、
クラスを作成するときにlen()
またはdef __len__()
を使用することの間に違い(利点と欠点)はありますか?そして、最高のPythonスタイル?
class foo(object):
def __init__(self,obs=[])
self.data = obs
self.max = max(obs)
self.min = min(obs)
self.len = len(obs)
または
class foo(object):
def __init__(self,obs=[])
self.data = obs
self.max = max(obs)
self.min = min(obs)
def __len__(self):
return len(self.data)
巨大の違いがあります。
__len__()
メソッドはフックメソッドです。 len()
functionは、オブジェクトの長さを照会するために___len__
_メソッドが存在する場合、それを使用します。
normal人々が使用することを期待しているAPIはlen()
メソッドであり、代わりに_.len
_属性を使用するとその標準から逸脱します。
_self.data
_の長さが変更されないと予想される場合、属性の長さを常にキャッシュし、.__len__()
がその属性を返すようにすることができます。
_class foo(object):
def __init__(self, obs=None):
if obs is None: # provide a default if no list was passed in.
obs = []
self.data = obs
self.max = max(obs)
self.min = min(obs)
self._data_len = len(obs)
def __len__(self):
return self._data_len
_
いくつかの違いがあります。
foo
の使い慣れたlen(obj)
構文を提供します。最初はobj.len()
が必要です。self.data
は、構築後に変更できます。2番目のバージョンのみが新しい長さを反映します。