2015-11-03 73 views
1

我有一系列可以通過傳遞參數來創建的類,或者如果忽略,它將使用默認的數據結構。所有類以相同的方式工作,即:在Python中級聯可選參數

class square(object): 
    _vertices = [ (0, 0), (0, 10), (10, 10), (10, 0) ] 
    def __init__(self, vertices=_vertices): 
     # more stuff ... 

class triangle(object): 
    _vertices = [ (0, 0), (5, 10), (10, 10) ] 
    def __init__(self, vertices=_vertices): 
     # more stuff ... 

# ... more classes 

我也有一個工廠函數,它接受一個字符串,並創建一個合適的對象

def create_shape(key) 
    if key == 'square': 
     return square() 
    elif key == 'triangle': 
     return triangle() 

雖然自然,這並不讓我通過頂點參數

shape1 = create_shape('square') # OK, basic creation 
shape2 = create_shape('triangle', my_own_vertices) # Not OK, param 2 
                # can't go through factory 

我的方式輪,這是美化廠區如下,但是,對我來說,這似乎的處理事情很笨拙的方式。

def create_shape(key, vertices=None): 
    if key == 'square': 
     return square(vertices) if vertices else square() 
    elif key == 'triangle': 
     return triangle(vertices) if vertices else triangle() 

從本質上說,我只是想通過一個可選的參數,而頂層(create_shape)知道默認的應該是什麼。有沒有更清晰/更簡單/更pythonic的方式來做到這一點?我已經看過其他問題/答案,但沒有比上述更好的了。

回答

5

如果你想傳遞可選參數的功能,你可以使用** kwags

def create_shape(key, **kwargs): 
    if key == 'square': 
     return square(**kwargs) 
    elif key == 'triangle': 
     return triangle(**kwargs) 

然後,你可以像這樣調用你的工廠函數。

create_shape('triangle', vertices = [(0,0), (1, 10)]) 

Triangle類的init函數將接收新的頂點值。

1

你可以改變你的形狀類爲None作爲默認參數,並在你的構造函數中處理None情況。

class square(object): 
    _vertices = [ (0, 0), (0, 10), (10, 10), (10, 0) ] 
    def __init__(self, vertices=None): 
     if not vertices: 
      vertices = _vertices 
     self.vertices = vertices 

然後,你可以使用默認參數在工廠類:

def create_shape(key, vertices=None): 
    if key == 'square': 
     return square(vertices) 
    elif key == 'triangle': 
     return triangle(vertices)