Skip to content Skip to sidebar Skip to footer

Class Constructor Able To Init With An Instance Of The Same Class Object

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 self

Solution 1:

Not sure what you're trying to achieve, but technically your error is here:

self = kwargs.get('object',self)

There's nothing magic with self, it's just a function argument, and as such a local variable, so rebinding it within the function will only make the local name self points to another object within the function's scope. It's in no way affecting the current instance (the one that was passed to __init__ by the method wrapper), it just makes self an alias for object.

If what you want is to copy attributes from object to self, you have to do it explicitly:

 other = kwargs.get('object')
 if other isnotNone:
     self.attrx = other.attrx
     self.attry = other.attry
     # etc

Oh and yes: Python is high-level language, there's nothing like "address affectation" - all you have are names refering to objects (really, name=>object mapping). A name is just a name, and where the object actually lives is none of your concerns.

Solution 2:

  • Thanks to the comments above I understand 2 things:

    • self is just a local variable and it s not the class instance
    • _init_ it s an class built-in method for initialize the instance from other object
  • So if I want to be able to initialize a new class instance from an existing instance, I have just to create an "initializer" method which call the _init_:

    classClass(): def__init__(self,**kwargs):
    
            self.attr1 = kwargs.pop('attr1',[])
            self.attr2 = kwargs.pop('attr2',[])
    
        defClass(self,**kwargs):
    
            return Class(attr1 = kwargs.pop('attr1',self.attr1),\
                         attr2 = kwargs.pop('attr2',self.attr2))
    

And use it like this:

inst = Class(attr1=[1,2,3])
print inst
print inst.attr1,inst.attr2

Output:

<__main__.Class instance at 0x7eff842d5368>
[1, 2, 3][]

inst2 = inst.Class(attr2=[12,11])
print inst2
print inst2.attr1,inst2.attr2

Output:

<__main__.Class instance at 0x7eff842d56c8>
[1, 2, 3][12, 11]

Post a Comment for "Class Constructor Able To Init With An Instance Of The Same Class Object"