Copy constructor and assignment operator
MRAB
python at mrabarnett.plus.com
Sun Sep 16 11:58:22 EDT 2018
On 2018-09-16 08:48, Ajay Patel wrote:
> Hello,
>
> Thanks for your reply.
>
> What happen if do copy using copy module? i can see address are
> different when using copy module.
> Which magic method will call when i an doing deepcopy?
> Snippet>>>>>>
>
> >>> p =Point(4,5)
> __setattr__
> __setattr__
> __setattr__
> >>> p
> (4,5)
> >>> id(p)
> 3072575564
> >>> import copy
> >>> p2 = copy.deepcopy(p)
> >>> p
> (4,5)
> >>> id(p2)
> 3072522924
> >>>
>
You don't necessarily have to do anything else; the copy/deepcopy
operation will create a new instance and copy/deepcopy the appropriate
attributes for you.
However, if you want more control, you can define a couple of dunder
methods to do it your own way.
I'll quote from the documentation page on the 'copy' module:
|"""|In order for a class to define its own copy implementation, it can
define special methods |__copy__()| and |__deepcopy__()|. The former is
called to implement the shallow copy operation; no additional arguments
are passed. The latter is called to implement the deep copy operation;
it is passed one argument, the memo dictionary. If the |__deepcopy__()|
implementation needs to make a deep copy of a component, it should call
the |deepcopy()| <#copy.deepcopy> function with the component as first
argument and the memo dictionary as second argument."""
>
>
> On Sun, Sep 16, 2018 at 1:12 AM MRAB <python at mrabarnett.plus.com
> <mailto:python at mrabarnett.plus.com>> wrote:
>
> On 2018-09-15 19:47, Ajay Patel wrote:
> >
> > I have created below code and i want to restrict an object copy.
> > What are the methods called for copy constructor and assignment
> operator? Basically i don't want to allow below operation.
> >
> > p = Point(1,3)
> > p2 = Point(6,7)
> >
> > => How to disallow below operations?
> > p(p2)
> > p = p2
> >
> > Please point out a documentation for the same if available.
> >
> >
> > class Point:
> >
> > def _init_(self, x = 0, y = 0):
> > self.x = x
> > self.y = y
> >
> > def _str_(self):
> > return "({0},{1})".format(self.x,self.y)
> >
> > def _repr_(self):
> > return "({0},{1})".format(self.x,self.y)
> >
> > def _call_(self,other):
> > print("_call_")
> > self.x = other.x
> > self.y = other.y
> >
> > def _setattr_(self, name, value):
> > print("_setattr_",name,value)
> >
>
> "__init__", etc, are referred to as "dunder" methods because they
> have
> double leading and trailing underscores. Those that you wrote have
> only
> single leading and trailing underscores.
>
> The term "copy constructor" is something from C++. It doesn't
> exist in
> Python.
>
> Assignment statements _never_ copy an object. If you want a copy
> of an
> object, you have to be explicit.
>
> Writing:
>
> p = p2
>
> will merely make 'p' refer to the same object that 'p2' currently
> refers to.
>
> For making a copy of an object, have a look at the "copy" module.
> --
> https://mail.python.org/mailman/listinfo/python-list
>
>
>
> --
> *Er. Ajay A Patel*
>
More information about the Python-list
mailing list