为什么要在使用类之前创建它的实例?

2024-05-13 04:23:30 发布

您现在位置:Python中文网/ 问答频道 /正文

原始问题

我在所有的例子中都看到人们首先创建一个类的实例: ss = StandardScaler()并且仅在此之后使用实例中的方法:ss.fit_transform(df),而不是调用类本身的方法:StandardScaler().fit_transform(df)

这是因为:

  1. 有些情况下会抛出错误
  2. 有些情况不会抛出错误,但会产生不同的结果(可怕!)
  3. 防止代码重复(但如果只使用一次,也可以)
  4. 最好在一行代码中只做一件事
  5. 美学与艺术;意见
  6. 其他原因,请告诉我

迄今为止的一些答案

谢谢你的回答,提出了许多澄清的观点,以下是我理解的一些观点。如果我弄错了,请纠正我

我建议先做一个实例的潜在原因:

有些情况下会抛出错误。

  • 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]]

Tags: 实例方法代码错误np情况transform原因
3条回答

这只是为了防止代码重复和美观。写ss.fit_transform(df)比写StandardScaler().fit_transform(int_array1)更简单。最后,这是课程的主要目的

and only after that using its methods: ss.fit_transform(df).

有两种类型的方法:类方法和(普通、实例)方法

只有类方法可以在没有实例(该类的对象)的情况下调用

即使这个-ss = StandardScaler()在您看来是空的,它也不是空的,它只是使用默认值作为参数。但它是可定制的,并且您可以有多个在其功能上稍有不同的定标器

在对象的情况下,一些东西可以存储在调用之间,这里也是这样-例如Scaler存储它看到的样本数,并在partial_fit (click for StandardScaler.partial_fit source code)中返回self(可能允许方法链接)

这个答案更多的是从一个普通问题的角度来回答。我不认为你的问题与你发布的代码有任何关系

考虑一下这样一个例子,您有一个函数定义,它需要用于不同的目的,如果您没有类,您就无法实现它。 类有助于实现init的目的以及变量的作用域

最重要的是,这是一种良好的设计方法,也有助于调试

相关问题 更多 >