2016-08-13 140 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方法输出的表示形式。

相关问题