2013-02-24 139 views
1

我有以下類Python類可以帶參數嗎?

class MetricLst(object): 
    def __init__(self,n): 
     self.min = min(n) 
     self.max = max(n) 

lst = [1,2,3,4,5] 
p = MetricLst(lst) 
print p.max 
5 
print p.min 
1 

與參數

class MetricArg(object): 
    def __init__(self,*args): 
     self.min = min(args) 
     self.max = max(args) 

p = MetricArg(1,2,3,4,5) 
p.max 
print 5 
p.min 
print 1 

我有以下問題:

  1. 如果我使用MetricArg,有一種優雅的方式來創建對象 使用列表?
  2. 當我創建一個班級(如果我可以)時,我是否需要更喜歡*參數?
+1

僅供參考:'*'被稱爲_splat_運算符。 – aviraldg 2013-02-24 21:23:32

+0

謝謝aviraldg。 – 2013-02-24 21:24:52

+1

@aviraldg - 我喜歡稱它爲* splat *,但我認爲它通常也被稱爲解包運算符。 – mgilson 2013-02-24 21:30:24

回答

3
  1. *args*語法具有鏡面主叫當量:

    p = MetricArg(*somelist) 
    

    somelist元素將被用來作爲參數MetricArg

  2. 這取決於你想呈現什麼樣的API。如果你想接受0或更多的參數,因爲這是你期望你的類被最方便地調用,那麼你使用這種形式。

    在Python API中,print()os.path.join()函數是使用任意長度參數列表的可調用函數的衆所周知的示例。

1

你可以不管是否使用函數的可變參數函數,而不是接受它實際上取決於功能的列表傳遞一個列表到可變參數函數或構造

L = [1, 2, 3, 4, 5] 
p = MetricArg(*L) 

函數/構造函數是否會經常使用動態構造列表來調用,還是會主要收到固定數量的參數?

如果列表大多是動態的,那麼接受列表是最好的主意,因爲您不會混淆*L的代碼。另一方面,如果在大多數情況下參數的數量在調用者中是固定的而且小的話只是傳遞參數比構建一個傳遞它的列表更可讀。

相關問題