【发布时间】:2023-03-27 06:08:01
【问题描述】:
我正在尝试通过类 P 更改矩阵 X 的顺序,该类 P 已经传递给基类 B 中的函数。顺序的更改不会反映在基类 B 中。有没有办法实现这个?请参阅以下 MWE:
#p.py
import numpy as np
import b
class P(b.B):
def __init__(self, opts):
self.opts = opts
def func1(self, X):
print('func1:',X)
def func2(self):
randomize = np.arange(len(self.myX))
np.random.shuffle(randomize)
self.myX = self.myX[randomize]
print('func2',self.myX)
def func3(self, X):
"""
X is a 2d matrix
"""
self.myX = X
#call the function from the base class
b.B.func3(self, self.myX)
#b.py
class B:
"""
base class.
"""
def __init__(self, opts):
self.opts = opts
def func3(self, X):
for n in range(2):
for i in range(X.shape[0]):
self.func1(X[i])
self.func2()
从控制台:
p1 = p.P({})
X=np.array([[1,2,3], [2,3,4], [3,4,5], [4,5,6], [5,6,7], [6,7,8]])
p1.func3(X)
电流输出:
func1: [1 2 3]
func1: [2 3 4]
func1: [3 4 5]
func1: [4 5 6]
func1: [5 6 7]
func1: [6 7 8]
func2 [[6 7 8]
[3 4 5]
[2 3 4]
[5 6 7]
[4 5 6]
[1 2 3]]
func1: [1 2 3]
func1: [2 3 4]
func1: [3 4 5]
func1: [4 5 6]
func1: [5 6 7]
func1: [6 7 8]
预期输出:
func1: [1 2 3]
func1: [2 3 4]
func1: [3 4 5]
func1: [4 5 6]
func1: [5 6 7]
func1: [6 7 8]
func2 [[6 7 8]
[3 4 5]
[2 3 4]
[5 6 7]
[4 5 6]
[1 2 3]]
func1: [6 7 8]
func1: [3 4 5]
func1: [2 3 4]
func1: [5 6 7]
func1: [4 5 6]
func1: [1 2 3]
所以基本上,当控件在B中从p.func2返回到func3时,X应该和self.myX一样。我相信这应该发生,因为 self.myX 默认通过引用传递给 b.func3。
【问题讨论】:
-
你能澄清一下你得到了什么行为以及你期望什么?正确运行未经修改的代码会为我调用
P的方法。 -
您的意思是您希望
B.func3()调用B.func1()和B.func2()而不是P.func1()和P.func2()?不清楚你在问什么。 -
您实际上正在覆盖基类
B中的所有方法,所以我不确定您使用b.B作为基类的意义。您甚至不需要该基类,因为无论如何您都在p.P.func3中直接引用b.B.func3。如果您打算保留b.B的方法,则需要以不同的方式命名函数。 “未反映在基类B中的更改”也令人困惑,因为您实际上只使用基类B创建了一个P实例。没有B的实例供您观察任何反射 - 一切都发生在P()之下。 -
@Idlehands 这是大代码的最低工作版本。我只是想解决这个问题,所以觉得没有必要包含函数的其他细节。