1

We have three class BlockTag,RowTag and ColumnTag.RowTag and ColumnTag both extend from BlockTag.You can see them below:

BlockTag:

class BlockTag(object):

    def __init__(self,font=None,content="",border=None,right_border=None,left_border=None,top_border=None,bottom_border=None,text_alignment=None,forecolor=None,backcolor=None):
        self.content=content
        self.border=border
        self.right_border=right_border
        self.left_border=left_border
        self.top_border=top_border
        self.bottom_border=bottom_border
        self.text_alignment=text_alignment
        self.forecolor=forecolor
        self.backcolor=backcolor
        self.font=font

    def __getitem__(self, item):
        try:
            return getattr(self,item)
        except AttributeError:
            return None;

RowTag:

class RowTag(BlockTag):

        def __init__(self,font=None,content="",border=None,right_border=None,left_border=None,top_border=None,bottom_border=None,text_alignment=None,forecolor=None,backcolor=None,skipInHTML=None,skipInPDF=None,skipInExcel=None,inner_td_tags=None):
            super(RowTag,self).__init__(font=font,content=content,border=border,right_border=right_border,left_border=left_border,top_border=top_border,bottom_border=bottom_border,text_alignment=text_alignment,forecolor=forecolor,backcolor=backcolor,)
            self.inner_td_tags=inner_td_tags #if inner_td_tags else []
            self.skipInExcel=skipInExcel
            self.skipInHTML=skipInHTML
            self.skipInPDF=skipInPDF

        def __iter__(self):
            return  iter(self.inner_td_tags);

        def add_td_tags(self,*input_td_tags):

            for i in input_td_tags:
                self.inner_td_tags.append(i)
            return self;

        def __getitem__(self, item):
            try:
                return getattr(self,item)
            except AttributeError:
                 return None;

ColumnTag:

class ColumnTag(BlockTag):

    def __init__(self,font=None,content="",border=None,right_border=None,left_border=None,top_border=None,bottom_border=None,text_alignment=None,forecolor=None,backcolor=None,image=None,row_span=None,col_span=None,width=None,verticalText=None,verticalAlign=None):

        super(ColumnTag,self).__init__(font=font,content=content,border=border,right_border=right_border,left_border=left_border,top_border=top_border,bottom_border=bottom_border,text_alignment=text_alignment,forecolor=forecolor,backcolor=backcolor)

        self.image=image
        self.row_span=row_span
        self.col_span=col_span
        self.width=width
        self.verticalText=verticalText;
        self.verticalAlign=verticalAlign;

    def __getitem__(self, item):
        try:
            return getattr(self,item)
        except AttributeError:
            return None;

The problem is that when I create two object of type RowTag the second object has the Columns of first Object!(as we know objects should be independent)

r1=RowTag().add_td_tags(
    ColumnTag(),
    ColumnTag(),
    ColumnTag(),
)

r2=RowTag()

print("size=>")
print(len(r2.inner_td_tags))#prints 3!!!!

I would be apperciate if You can help me even a bit.

  • 1
    When I [run this](http://ideone.com/9DA2iC), it doesn't do what you say it does. I bet your actual code has a mutable default argument bug in the `RowTag` `__init__`, saying `inner_td_tags=[]` instead of `inner_td_tags=None`. See http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – user2357112 Jul 16 '14 at 07:54

1 Answers1

0

in rowtag class keep

self.inner_td_tags=inner_td_tags if inner_td_tags else []

and one more thing there are many ; in your python code. no need to give them so remove that and your code works fine

print("size=>")
print(len(r2.inner_td_tags))

print("size=>")
print(len(r1.inner_td_tags))

output

size=>
0
size=>
3
sundar nataraj
  • 8,524
  • 2
  • 34
  • 46