【发布时间】:2021-03-17 17:10:33
【问题描述】:
原问题
我几乎在所有示例中都看到人们首先创建一个类的实例:
ss = StandardScaler() 之后才使用实例中的方法:ss.fit_transform(df),而不是在类本身上调用方法:StandardScaler().fit_transform(df)。
这是因为:
- 在某些情况下,否则会引发错误。
- 有些情况不会引发错误,但会产生不同的结果(可怕!)
- 防止代码重复(但没关系,如果它只使用一次。)
- 最好在一行代码中只做一件事。
- 美学和观点。
- 还有其他原因,请告诉我!
到目前为止的一些答案
感谢您提出许多澄清问题的答案,以下是我理解的一些问题。如果我错了,请纠正我。
我建议先创建实例的潜在原因:
有些情况会抛出错误。
- Thomas Weller 在下面的回答指出不应该存在,因为在类上调用该方法会创建一个临时实例 - 它只是不会存储在变量中。
有些情况不会抛出错误,但会产生不同的结果(可怕!)
- Thomas Weller 在下面的回答指出不应该,因为在类上调用该方法会创建一个临时实例。
如果只使用一次,可以调用类本身。
- 这似乎是真的,因为没有理由将实例存储在变量中,重复也不成问题。
最好在一行代码中只做一件事。
- 可读性比每行只做一件事更重要。在我看来,这两个版本都一样清晰易读。
审美与观点
- 其中也涉及到其中一些。
还有其他原因,请告诉我!
- 当然,面向对象编程在很多方面都很有用,但我的问题只涉及单独使用一个类和其他人已经为我编程的方法。
- 我的问题不在于您是否可以将参数放入类或方法中 - 我的示例实际上是这样做的:
np.random.default_rng(0).integers(10, size=(4,5))
代码示例
import numpy as np
from sklearn.preprocessing import StandardScaler
# Here I'm using .interegs() without making an instance first
int_array1 = np.random.default_rng(0).integers(10, size=(4,5))
# Here I'm using .interegs() without making an instance first
int_array2 = StandardScaler().fit_transform(int_array1)
# This time instantiating before using for comparison
rng = np.random.default_rng(0)
int_array3 = rng.integers(10, size=(4,5))
ss = StandardScaler()
int_array4 = ss.fit_transform(int_array3)
print(int_array1)
print(int_array2)
print(int_array3)
print(int_array4)
无论实例化如何,输出都具有相同的结果。
[[8 6 5 2 3]
[0 0 0 1 8]
[6 9 5 6 9]
[7 6 5 5 9]]
[[ 0.88354126 0.22941573 0.57735027 -0.72760688 -1.70856429]
[-1.68676059 -1.60591014 -1.73205081 -1.21267813 0.30151134]
[ 0.2409658 1.14707867 0.57735027 1.21267813 0.70352647]
[ 0.56225353 0.22941573 0.57735027 0.72760688 0.70352647]]
[[8 6 5 2 3]
[0 0 0 1 8]
[6 9 5 6 9]
[7 6 5 5 9]]
[[ 0.88354126 0.22941573 0.57735027 -0.72760688 -1.70856429]
[-1.68676059 -1.60591014 -1.73205081 -1.21267813 0.30151134]
[ 0.2409658 1.14707867 0.57735027 1.21267813 0.70352647]
[ 0.56225353 0.22941573 0.57735027 0.72760688 0.70352647]]
【问题讨论】:
-
因为一个类的重点就是创建实例。考虑任何类,
int、list、dict等... -
建议您阅读Object-Oriented Programming 上的维基百科文章。
-
"这里我使用 .interegs() 没有先实例化" 不,你肯定是先实例化的。
标签: python class instantiation