【问题标题】:Python super class / sub class infinite loopPython超类/子类无限循环
【发布时间】:2022-01-06 17:29:24
【问题描述】:

我是一名学生,刚接触 Python。我有以下代码:

class A:
  ...

  def fit(self, X, y):
     ...
     return self

  def transform(self, X):
    ...
    return transformed_X

  def fit_transform(self, X, y):
    return self.fit(X, y).transform(X)

class B(A):
  ...

  def fit(self, X, y):
    transformed_X = super().fit_transform(X, y)
    ...

我认为这会导致无限循环(BA 中调用fit_transform,然后在B 中再次调用fit 等等)。它是否正确?我该如何解决这个问题?我希望 B 中的调用 super().fit_transform(X, y) 返回如果对象只是 A 类型时的结果。

谢谢。

【问题讨论】:

  • fit 转换在您的示例中仅采用 X 参数。您能否澄清一下您希望B.fit 的输出是什么(即与A.fit 相同或与A.fit_transform 相同)
  • @AntoineRedier 抱歉,A.fit_transform 也应该使用 y。我已经编辑了我的问题。我希望B.fit 中的transformed_X 成为A.fit_transform 返回的内容。
  • return A.fit(self, X, y).transform(X) 当然可以,但这在我看来是个有缺陷的设计。

标签: python oop subclass superclass


【解决方案1】:

正如您指出的那样,super().fit_transform(X, y) 相当于 A.fit_transform(self, X, y) 调用 self.fit 并且 self 是 B 的一个实例。因此无限递归。

一种方法是硬编码A.fitA.fit_transform 中的用法,如下所示:

class A:
    
    def fit(self, X, y):
        print("A fit")
        return self

    def transform(self, X):
        print("A transform")
        return "here we are"

    def fit_transform(self, X, y):
        print("A fit_transsform")
        return A.fit(self, X, y).transform(X)

class B(A):
  

  def fit(self, X, y):
    print("B fit")
    transformed_X = super().fit_transform(X, y)
    return transformed_X

哪个打印:

B fit
A fit_transsform
A fit
A transform
'here we are'

但是这段代码非常丑陋,并且您的类/方法可能设计不正确(可能是组合而不是继承,因为 B 似乎 使用 A 而不是 作为 A )

【讨论】:

    【解决方案2】:

    如果您只希望 B.fit_transform 像 A 类型一样返回,那么只需:

    class B:
        def fit_transform(self, X, y):
            return A().fit_transform(X, y)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多