gpt4 book ai didi

python - 更新类变量时更新另一个类变量

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:18 24 4
gpt4 key购买 nike

我正在尝试创建一个存储原始输入的矩阵类,然后从原始输入创建另外 2 个变量,称为行和列,这意味着我可以通过执行类似 matrix([ [1, 2], [3, 4]]).rows[0] 获取 [1, 2] 或 matrix([[1, 2], [3, 4]]).columns[0] 获取 [ 1, 3]。到目前为止,这工作得很好,但是如果我想将行或列重新分配给另一个值,例如:

A = matrix([[1, 2], [3, 4]])
print(A.columns[0])

这给了我:

[1, 2]

但是如果我要进一步执行此代码块来更新这样的列,

A.columns[0] = [5, 6]

然后再次打印出A,它会给我原始输入,

print(A)

[[1, 2], [3, 4]]

但是打印 a.columns[0] 会给我更新的列,

[5, 6]

并将 a.columns 作为一个整体打印给我

[[5, 6], [2, 4]]

我如何以这样的方式进行编码,以便执行 A.columns[0] 更新输入变量和列变量?这是我的原始代码:

class matrix:
def __init__(self, values):
self.values = values
self.rows = [row for row in self.values]
self.columns = [[row[i] for row in self.values] for i in range(list(set([len(row) for row in self.values]))[0])]

def __setattr__(self, name, value):
if name not in ["rows", "columns"]:
self.__dict__[name] = value
elif hasattr(self, name):
#This is the part of code I'm trying to use to attempt updating self.values and self.columns at once, but it isn't even printing so I didn't bother writing any code for it
print name, value
else:
self.__dict__[name] = value

def __setitem__(self, index, value):
print index, value

def __str__(self):
return str(self.values)

a = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a.columns[1] = [4, 4, 4]
print(a)

仍然给出

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

当我希望它给我 [[1, 4, 3], [4, 4, 6], [7, 4, 9]] 时,但是当然更新 columns 变量与 self 无关.values(这是原始输入变量),因为它就像有两个完全独立的变量。如何将它们链接在一起,以便 self.values 的任何更改都会更新为 self.columns 和 self.rows,并且 self.columns 和 self.rows 的任何更改都会更新 self.values?

最佳答案

你问的问题并不容易。您想要:

  • 定义一些看起来像类中的属性的内容
  • 但是您不希望该属性保留任何值。
  • 显示另一个属性的转换
  • 能够检索或设置该转换的一部分

实现这一点的方法是创建一个 property attribute这将为您提供所需的内容,而不是在创建实例时复制值。然后,该属性特性可以重写该方法以模拟矩阵中的索引。它可能看起来像:

class Matrix:

def __init__(self, values):
self.values = values
self.rows = self.Row_view(self)
self.columns = self.Columns_view(self)

class Columns_view:

def __init__(self, owner):
self.owner = owner

def __str__(self):
return str(list(list(x) for x in zip(*self.owner.values)))

def __getitem__(self, key):
return [row[key] for row in self.owner.values]

def __setitem__(self, key, new_values):
for (row, new_row_value) in zip(self.owner.values, new_values):
row[key] = new_row_value

class Row_view:

def __init__(self, owner):
self.owner = owner

def __str__(self):
return str(self.owner.values)

def __getitem__(self, key):
return self.owner.values[key]

def __setitem__(self, key, new_values):
self.owner.values[key] = new_values

def __str__(self):
return str(self.values)

A = Matrix([[1, 2], [3, 4]])
print(A.columns[0])

A.columns[0] = [5, 6]
print(A)

print(A.columns[0])
print(A.columns)

a = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a.columns[1] = [4, 4, 4]
print(a)

print(a.columns[:2])

可能还有其他方法可以做到这一点,但这可能是更简单的方法,除非您有其他要求。

关于python - 更新类变量时更新另一个类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53562242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com