2012年02月26日 星期日 12:26
蓝色是代码(无关语句已被省去):
(1) 一系列复杂操作得到对象AAA的实例A
(2) bestScore=0
(3) for k in range(100):
(4) A.ChangeSomething()
(5) if A.score>bestScore:
(6) bestScore=A.score
(7) bestA=A
因为bestA=A只创建了A的一个引用,上面的代码bestA永远是k=99时的A!我尝试在bestA=A后对bestA做一些属性的改动,结果也无济于事。好像只有在bestA=A后面强制改变bestA的id才是最省事的方法。是不是该这么解决?
注:1.(1)比较复杂。若在这一步生成两个实例:(1)—A,(1)'—bestA,这个(1)'很长的;
2.(4)Change的属性也较多。若将(7)改成:bestA.attriChanged=A.attriChanged,也比较烦;
2012年02月26日 星期日 12:35
这要看AAA类是如何定义的,以及A.ChangeSomething()做了些什么。不知道你是如何强制改变bestA的id的,这个应该是不可能的吧。
你可以试着复制一份A,例如用copy模块中的copy或者deepcopy。bestA=copy(A)或者bestA=deepcopy(A)。
但是需要知道完整的代码才能给出合理的方案。
2012年02月26日 星期日 13:10
呵呵,我也不知道怎么改id,只是想想罢了。先试试你说的copy吧
2012年02月26日 星期日 16:06
2012年02月26日 星期日 17:48
总之我就是想根据已有的实例A,复制一个A1,A1的属性取值和A是相等的,但所有属性都不是引用。
可不可以这样做:
给AAA定义一个特殊的函数AAA.Copy(self,A),输入为AAA的实例A,返回一个新的实例A1,
在函数内A1调用copy模块复制A的所有属性
2012年02月26日 星期日 17:58
直接对实例使用copy或者deepcopy,
如A1=copy.deepcopy(A),
此时,有一些属性是真正的备份,而那些类的静态属性和构造函数里添加的属性都是引用。
2012年02月26日 星期日 18:45
类的静态属性当然不会复制到bestA中,类的静态属性是类的,不是实例的。还是看到程序之后再讨论吧。
2012年02月27日 星期一 13:01
应该把hassub, Beam之类的当作是实例的属性,而不是类的属性:
from copy import deepcopy
class Params(object):
pass
def IdentifyF(lamda):
'确定天线频段'
if lamda>100: fband=u'广播段'
elif lamda<=100 and lamda>10: fband=u'HF(高频)'
else: fband=u'UHF(超高频)'
return fband
class ArrayAnt(object):
'基类'
c=3e8 #光速
def __init__(self,lamda=2.5e-2,u0=0,v0=0):
self.hassub = 0
self.Beam = Params()
self.PM = Params()
self.Wopt = Params()
self.Wsub = Params()
self.Werror = Params()
self.lamda=lamda #天线设计的工作波长
self.f=self.c/self.lamda #
self.fband=IdentifyF(lamda)
self.Beam.u=u0 #天线波束指向
self.Beam.v=v0
a = ArrayAnt()
a.Beam.u = 1.0
b = deepcopy(a)
a.Beam.u = 2.0
print b.Beam.u
Zeuux © 2024
京ICP备05028076号