當我呼叫一個類物件時,我希望它回傳一個串列或字串以外的任何其他變數
class Vec:
def __init__(self, data) -> None:
self.data = data #THIS IS A LIST
def __str__(self) -> list:
return self.data
a = Vec([0,1,2,3])
print(a)
#TypeError: __str__ returned non-string (type list)
相反,我得到一個 TypeError,如果我將“self.data”設定為一個字串,它將起作用
有什么神奇的方法嗎?提前致謝
這是完整的代碼,以防您需要全部查看
注意:我還沒有完成它,我的問題是,例如,如果我想乘以我必須做的Mat或(T 代表轉置),我不喜歡,我只想輸入以防萬一需要轉置向量。對不起我的混亂代碼和我對我的問題的錯誤解釋VecMat * Vec.dataMat * Vec.TMat * Vec
class MatrixMatchError(Exception):
def __init__(self):
self.message = "Matrix sizes do not match"
super().__init__(self.message)
pass
class MatrixRowColError(Exception):
def __init__(self):
self.message = "The number of columns in the first matrix do not equal to the number of rows in the second."
super().__init__(self.message)
pass
class Vec:
def __init__(self, x, identity=1) -> None:
self.x = x
self.data = self.Create(x, 1, identity)
self.T = self.Transpose()
def Create(self, x, y, identity) -> list:
vec = []
for i in range(y):
vec.append([])
for j in range(x):
vec[i].append(identity)
return vec
def Transpose(self) -> list:
vec = self.Create(len(self.data), len(self.data[0]), 0)
for i in range(len(self.data)):
for j in range(len(self.data[0])):
vec[j][i] = self.data[i][j]
return vec
class Mat:
def __init__(self, x, y=0, identity=1) -> None:
self.x = x
if y == 0:
self.y = x
else:
self.y = y
self.data = self.Create(self.x, self.y, identity)
self.T = self.Transpose()
def __add__(self, data):
if not self.CheckSize(data):
raise MatrixMatchError
mat3 = self.data.copy()
for i in range(len(self.data)):
for j in range(len(self.data[0])):
mat3[i][j] = self.data[i][j] data[i][j]
return mat3
def __sub__(self, data):
if not self.CheckSize(data):
raise MatrixMatchError
mat3 = self.data.copy()
for i in range(len(self.data)):
for j in range(len(self.data[0])):
mat3[i][j] = self.data[i][j] - data[i][j]
return mat3
def __mul__(self, data):
if not self.CheckRowCol(data):
raise MatrixRowColError
mat3 = self.Create(len(data[0]), len(self.data), 0)
for i in range(len(self.data)):
for j in range(len(data[0])):
for k in range(len(self.data[0])):
mat3[i][j] = self.data[i][k] * data[k][j]
return mat3
def Create(self, x, y, identity) -> list:
mat = []
for i in range(y):
mat.append([])
for j in range(x):
mat[i].append(0)
if x == y:
for i in range(x):
mat[i][i] = identity
return mat
def Transpose(self) -> list:
mat = self.Create(len(self.data), len(self.data[0]), 0)
for i in range(len(self.data)):
for j in range(len(self.data[0])):
mat[j][i] = self.data[i][j]
return mat
def CheckSize(self, data):
if len(self.data) != len(data) or len(self.data[0]) != len(data[0]):
return False
return True
def CheckRowCol(self, data):
if len(data) != len(self.data[0]):
return False
return True
def Transform(self):
pass
def Scale(self):
pass
def Rotate(self):
pass
mat1 = Mat(2)
mat1.data = [[4,5, 4],
[9,3, 7],
[7,1, 3]]
vec = Vec(3)
print(mat1 * vec.T)
uj5u.com熱心網友回復:
如果內置函式呼叫您并獲得不是字串的內容,則內置str()函式將引發 a ,并且您不會說服它這樣做。TypeError__str__
您可能想要的是Vec.__str__回傳的字串表示data,而不是data它本身:
class Vec:
def __init__(self, data: list) -> None:
self.data = data
def __str__(self) -> str:
return str(self.data)
該__str__方法與您的其他用例無關:
例如,如果我想乘以我必須做的
Mat或(T 代表轉置)我不喜歡的,我只想輸入以防我不需要轉置向量。VecMat * Vec.dataMat * Vec.TMat * Vec
這應該在Mat.__mul__(它應該在 a 上操作Vec,而不是底層list)和Vec.T/ Vec.Transpose(它應該回傳 a Vec,而不是 a list)中解決:
class Vec:
...
def Transpose(self) -> 'Vec':
vec = self.Create(len(self.data), len(self.data[0]), 0)
for i in range(len(self.data)):
for j in range(len(self.data[0])):
vec[j][i] = self.data[i][j]
return Vec(vec)
class Mat:
...
def __mul__(self, vec: Vec) -> list[list[int]]:
if not self.CheckRowCol(vec.data):
raise MatrixRowColError
mat3 = self.Create(len(vec.data[0]), len(self.data), 0)
for i in range(len(self.data)):
for j in range(len(vec.data[0])):
for k in range(len(self.data[0])):
mat3[i][j] = self.data[i][k] * vec.data[k][j]
return mat3
現在你確實可以做Mat * Vec或Mat * Vec.T它會做正確的事。
Mat.__mul__請注意,回傳 a可能會更好Mat,但是您還沒有提供一個建構式,使我可以輕松地實作該部分 - 不過我希望這可以讓您更好地考慮您的類介面以及它們是如何實作的可以使使用該類更容易(或更難)!理想情況下,該類的用戶甚至不應該能夠訪問內部,更不用說被迫訪問了。
與此無關,我建議花一些時間學習 Python 的串列理解語法,因為它會為您節省大量串列分配樣板檔案(即您的各種Create方法)。:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429467.html
上一篇:如何使用StringBuilder將C#串列轉換為每行具有固定專案數的字串?
下一篇:編碼密碼
