newbie: copy base class fields

Marc 'BlackJack' Rintsch bj_666 at gmx.net
Thu May 3 10:29:01 EDT 2007


In <1178201644.920048.205400 at y5g2000hsa.googlegroups.com>, tmp123 wrote:

> The following small program gives an error:
> 
> #!/usr/bin/python
> #
> 
> class A:
>   def __init__(self):
>     self.v1=1
> 
>   def __repr__(self):
>      return "v1=%d\n" % self.v1
> 
> class B(A):
>   def __init__(self,a):
>     self=a
>     self.v2=2
> 
>   def __repr__(self):
>      return A.__repr__(self) + ("v2=%d\n" % self.v2)
> 
> x=A()
> print x
> 
> y=B(x)
> print y
> 
> 
> 
> $ ./prueba.pl
> v1=1
> 
> Traceback (most recent call last):
>   File "./prueba.pl", line 23, in <module>
>     print y
>   File "./prueba.pl", line 17, in __repr__
>     return A.__repr__(self) + ("v2=%d\n" % self.v2)
>   File "./prueba.pl", line 9, in __repr__
>     return "v1=%d\n" % self.v1
> AttributeError: B instance has no attribute 'v1'
> 
> 
> It seems that the statement "self=a" is not the correct way to copy
> all the fields of the base class from the __init__ argument to the new
> object.

This binds the local name `self` to the same object that is bound to `a`. 
Now you have lost the reference to the instance, so the next line sets the
attribute `v2` on the object passed to the constructor of the `B` object.

> Of course, it is not an option to copy one by one all the fields of
> class A inside the __init__ of B.
> 
> Several variants of the program produces similar results.
> 
> Please, could someone explain which way is the correct way?

Call the `__init__()` of `A`:

class B(A):
    def __init__(self, a):
        A.__init__(self)
        self.v2 = 2

Ciao,
	Marc 'BlackJack' Rintsch



More information about the Python-list mailing list