2017-01-23 46 views
0

正如標題所示,我試圖傳遞我的類的屬性作爲該類的一個函數的參數。在下面的示例中,默認情況下print_top_n()的功能將打印self.topn,但如果需要,也可以使用不同的值調用函數。這是一個Python(或一般編程)犯規還是有辦法做到這一點?將類屬性作爲Python中該類的函數的參數傳遞

>>> class Example(): 
    def __init__(self, topn=5): 
     self.topn = topn 
    def print_top_n(self, n=self.topn): 
     print n 



Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    class Example(): 
    File "<pyshell#7>", line 4, in Example 
    def print_top_n(self, n=self.topn): 
NameError: name 'self' is not defined 

回答

1

創建類時創建的方法,並在創建方法時的默認值設置(見本question/answer) - 他們沒有重新evaluted當函數被調用。換句話說,這一切都在self被創建之前很久(因此NameError)。

典型的方法是使用可在print_top_nNone是最常見的)中檢查的標記值。

def print_top_n(self, n=None): 
    n = self.topn if n is None else n 
    print n 
0

不;當功能被定義時,默認值被評估,所以沒有對象還沒有對其執行屬性訪問。您可以使用標記值代替:

def print_top_n(self, n=None): 
    if n is None: 
     n = self.topn 
    print n 
3

一個選項是使用標記對象。這是一個比n=None更好的模式(取決於您的api的實際意圖),因爲即使有意通過n=None,它也會起作用。

marker = object() 

class Example: 
    def __init__(self, topn=5): 
     self.topn = topn 

    def print_top_n(self, n=marker): 
     if n is marker: 
      n = self.topn 
     print(n) 
相關問題