我正在用Python创建我的第一个程序。我需要将对象添加到列表中,然后在FOR循环中创建这些对象。问题是,在填写列表后,如果我检查任何对象的值,它们看起来都像添加的最后一个对象。
class clsNumeros:
numero = 4
oper = [int() for i in range(5)]
def __init__(self, op1, op2, op3, op4):
self.oper[1] = op1
self.oper[2] = op2
self.oper[3] = op3
self.oper[4] = op4
def CountOperaciones():
return 5
def GetValorOper(self, idxOper):
num = self.oper[idxOper]
if num == 1:
return num
elif num == 2:
return sqrt(num)
elif num == 3:
return Factorial(num)
elif num == 4:
return 4/10
elif num == 5:
return sqrt(0.4)
def GetExprOper(self, idxOper):
num = self.oper[idxOper]
if num == 1:
return num
elif num == 2:
return "R(" + num + ")"
elif num == 3:
return num + "!"
elif num == 4:
return "0.4"
elif num == 5:
return "R(0.4)"
def Display(self):
txt = ""
for x in range(1, 5):
txt = txt + str(self.oper[x])
txt = txt + " ___ "
print (txt)
def GeneraNumeros():
c = []
idx = [int() for i in range(5)]
i = 0
idx[1] = 1
idx[2] = 1
idx[3] = 1
idx[4] = 1
looping = 1
n = 0
while looping == 1:
num = clsNumeros(idx[1], idx[2], idx[3], idx[4])
c.append(num)
n = n + 1
idx[4] = idx[4] + 1
for i in range (4, 1, -1):
if idx[i] > clsNumeros.CountOperaciones():
idx[i] = 1
idx[i-1] = idx[i-1] + 1
if idx[1] > clsNumeros.CountOperaciones():
looping = 0
c[5].Display() # this is for displaying object number 5. All of them look like the last one
return numeros
可能有什么不对?我可以在FOR循环中创建对象并期望它们是唯一的吗? 这个想法在ASP.NET上运行良好。
谢谢!
答案 0 :(得分:3)
问题在于:
class clsNumeros:
oper = [int() for i in range(5)]
在类定义时,类变量被计算一次。因此,此处仅创建一个列表实例。通过在构造函数中初始化oper
来修复它。
其他问题:
0
而不是int()
[0]*5
而不是[0 for i in range(5)]
method_name
和ClassName
,跟随它们很好class clsNumeros(object)
的习惯,因为其他(较旧的)语法导致Python中的“旧式”类行为略有不同Display
方法简化方法str.join
,例如'__'.join(items)