Python super class / sub class 无限循环
Python super class / sub class infinite loop
我是一名学生,刚接触 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)
...
我认为这会导致无限循环(B
在 A
中调用 fit_transform
,然后在 B
中再次调用 fit
等)。这个对吗?我该如何解决这个问题?我希望在 B
中调用 super().fit_transform(X, y)
到 return 如果对象只是类型 A
.
会怎样
谢谢。
正如您所指出的,super().fit_transform(X, y)
等同于 A.fit_transform(self, X, y)
调用 self.fit
并且 self 是 B 的一个实例。因此无限递归。
一种方法是 hard_code A.fit
在 A.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'
但是这段代码非常丑陋,您的 classes/methods 可能设计不当(可能是组合而不是继承,因为 B 似乎 使用 A 而不是 成为一个A)
我是一名学生,刚接触 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)
...
我认为这会导致无限循环(B
在 A
中调用 fit_transform
,然后在 B
中再次调用 fit
等)。这个对吗?我该如何解决这个问题?我希望在 B
中调用 super().fit_transform(X, y)
到 return 如果对象只是类型 A
.
谢谢。
正如您所指出的,super().fit_transform(X, y)
等同于 A.fit_transform(self, X, y)
调用 self.fit
并且 self 是 B 的一个实例。因此无限递归。
一种方法是 hard_code A.fit
在 A.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'
但是这段代码非常丑陋,您的 classes/methods 可能设计不当(可能是组合而不是继承,因为 B 似乎 使用 A 而不是 成为一个A)