2013-02-27 22 views
13

只是好奇,使用LEN()和高清__len __(個體經營):打造一流

是否有使用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) 
+1

第一個和第二個相當嗎? – 2013-02-27 14:05:10

+6

請注意,除非您知道自己在做什麼,否則不應將'[]'用作關鍵字參數的默認值。參見[「Python中的最小驚訝」:可變的默認參數](http://stackoverflow.com/q/1132941) – 2013-02-27 14:06:22

回答

25

有一個巨大的差異

__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 
6

有幾個不同點:

  1. 只有第二種方法會給你熟悉的len(obj)語法foo。第一個將需要obj.len()
  2. 如果self.data的長度可以改變後建設,只有第二個版本將反映新的長度。
相關問題