2016-08-13 142 views
2

我是Python新手,並且一直在閱讀一些Python科學庫的API示例。爲什麼這些python代碼實例都調用構造函數兩次?

在一個庫中,scikit-learn,代碼示例總是在沒有參數的情況下調用構造函數,然後再次調用所有參數。

下面是一個例子(見最後一行,和最後一行(CLF =線性_....),從sklearn.linear_model.SGDRegressor文件之前採取第三:

>>> import numpy as np 
>>> from sklearn import linear_model 
>>> n_samples, n_features = 10, 5 
>>> np.random.seed(0) 
>>> y = np.random.randn(n_samples) 
>>> X = np.random.randn(n_samples, n_features) 
>>> clf = linear_model.SGDRegressor() 
>>> clf.fit(X, y) 
... 
SGDRegressor(alpha=0.0001, average=False, epsilon=0.1, eta0=0.01, 
      fit_intercept=True, l1_ratio=0.15, learning_rate='invscaling', 
      loss='squared_loss', n_iter=5, penalty='l2', power_t=0.25, 
      random_state=None, shuffle=True, verbose=0, warm_start=False) 

我想我可能誤解的東西關於Python,因爲我不明白爲什麼構造函數調用兩次?是否有一個原因,還是隻是爲了顯示構造函數的所有可能的參數一個奇怪的方式?

+1

你確定他叫了兩次嗎?這不僅僅是構造實例的'__repr__'的一個例子嗎?該行不以'>>>'作爲前綴。 – pistache

回答

3

什麼你正在閱讀是doctest,嵌入在文檔字符串中的測試。

Doctests使用前綴爲>>>的行來指示可運行的示例,但它們的輸出顯示爲前綴無前綴。

測試運行器將匹配示例的輸出和文檔測試中寫入的輸出。

我們可以看到,通過運行在IPython的解釋的例子:

In [18]: import numpy as np 

In [19]: np.random.seed(0) 

In [20]: y = np.random.randn(n_samples) 

In [21]: X = np.random.randn(n_samples, n_features) 

In [22]: clf = linear_model.SGDRegressor() 

In [23]: clf.fit(X, y) 
Out[23]: 
SGDRegressor(alpha=0.0001, average=False, epsilon=0.1, eta0=0.01, 
     fit_intercept=True, l1_ratio=0.15, learning_rate='invscaling', 
     loss='squared_loss', n_iter=5, penalty='l2', power_t=0.25, 
     random_state=None, shuffle=True, verbose=0, warm_start=False) 

TLDR;您看到的第二個構造函數不在代碼中,只是fit方法輸出的表示形式。

相關問題