Can python create a class that can be initialised with an instance of the same class object?
I've tried this:
class Class(): def __init__(self,**kwargs):print selfself = kwargs.get('obj',self)print selfif not hasattr(self,'attr1'):print 'attr1'self.attr1 = kwargs.pop('attr1',[])if not hasattr(self,'attr2'):print 'attr2'self.attr2 = kwargs.pop('attr2',[])print selfself.attr1 = kwargs.pop('attr1',self.attr1)self.attr2 = kwargs.pop('attr2',self.attr2)print self.attr1print self.attr2
If I create a new instance there is no problem:
inst = Class(attr1=[1,2,3])
print inst
print inst.attr1,inst.attr2
The output is:
<__main__.Class instance at 0x7f2025834cf8>
<__main__.Class instance at 0x7f2025834cf8>
attr1
attr2
<__main__.Class instance at 0x7f2025834cf8>
[1, 2, 3]
[]
<__main__.Class instance at 0x7f2025834cf8>
[1, 2, 3] []
But if I create a new instance with the instance inst
:
inst2 = Class(obj=inst)
print inst2
print inst2.attr1,inst2.attr2
The output is:
<__main__.Class instance at 0x7f202584b7e8>
<__main__.Class instance at 0x7f2025835830>
<__main__.Class instance at 0x7f2025835830>
[1, 2, 3]
[] <__main__.Class instance at 0x7f202584b7e8>
AttributeError Traceback (most recent call last)
<ipython-input-228-29c9869a9f4d> in <module>() 1 inst2 = Class(obj=inst) 2 print inst2 ----> 3 print inst2.attr1,inst2.attr2 AttributeError: Class instance has no attribute 'attr1'
I handle the problem but i dont know how to solve it:
- in the 1st case the instance address is always the same ("inside" and "outside" the class)
in the 2nd case:
- "inside" the class:
- the init call create a new instance at a new address
- then self is set to the previous instance and change address: OK
self
already has attributesattr1
andatrr2
: OKbut "outside" the class:
inst2
has the address from the init and has no attributes!
What is wrong ? How does address affectation work in Python? Is it a good manner of doing this?