[问题] override __setattr__碰到怪状况

楼主: kdjf (我抓得到什么呢?)   2020-12-18 01:34:54
我在override __setattr__时不知道为什么没办法assing某个变量
错误讯息也很怪
>>> class pin(int):
... def __new__(cls,pin,inv,oc,out):
... i=int.__new__(cls,1<<pin)
... i.pin=pin
... i.inv=inv<<pin
... i.oc=oc<<pin
... i.out=out<<pin
... return(i)
...
>>> class port():
... OC=0
... OUT=0
... def __setattr__(self,name,value):
... # self.OC=value.oc
... # self.OUT=value.out
... print(value.out)
... self.OC=value.out
... print(value.out)
... super().__setattr__(name, value)
...
>>> P=port()
>>> M=pin(pin=0,inv=1,oc=0,out=1)
>>> P.M=M
1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __setattr__
File "<stdin>", line 7, in __setattr__
AttributeError: 'int' object has no attribute 'out'
>>>
看起来是value.out不存在,但是print(value.out)是正常的?
还是其实是super那行报的错?
作者: ckc1ark (伪物)   2020-12-18 02:40:00
self.OC=value.out 这行一样会call进__setattr__
楼主: kdjf (我抓得到什么呢?)   2020-12-18 08:00:00
感谢,我糊涂了卡在想产生新变量时更新内容,但setattr在旧变量也会触发发现直接写入__dict__也可以,不过可能不安全 (?)
作者: ckc1ark (伪物)   2020-12-19 01:15:00
改成 super().__setattr__('OC', value.out) 这样?
楼主: kdjf (我抓得到什么呢?)   2020-12-21 09:42:00
嗯嗯我是这样改,可用了

Links booklink

Contact Us: admin [ a t ] ucptt.com