好奇,
在构建类时使用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)
答案 0 :(得分:37)
存在巨大的差异。
__len__()
方法是一种钩子方法。 len()
函数将使用__len__
方法(如果存在)查询对象的长度。
人们期望使用的普通 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
答案 1 :(得分:6)
有几点不同:
len(obj)
提供熟悉的foo
语法。第一个将需要obj.len()
。self.data
的长度可以在构造后更改,则只有第二个版本会反映新的长度。