@@ -62,21 +62,20 @@ def __init__(self, dataframe: bigframes.dataframe.DataFrame):
6262 super ().__init__ ()
6363 self ._dataframe = dataframe
6464
65+ # Initialize attributes that might be needed by observers FIRST
66+ self ._table_id = str (uuid .uuid4 ())
67+ self ._all_data_loaded = False
68+ self ._batch_iter : Optional [Iterator [pd .DataFrame ]] = None
69+ self ._cached_batches : List [pd .DataFrame ] = []
70+
6571 # respect display options for initial page size
6672 initial_page_size = bigframes .options .display .max_rows
67- self .page_size = initial_page_size
6873
6974 # Initialize data fetching attributes.
70- self ._batches = dataframe .to_pandas_batches (page_size = self . page_size )
75+ self ._batches = dataframe .to_pandas_batches (page_size = initial_page_size )
7176
72- # Use list of DataFrames to avoid memory copies from concatenation
73- self ._cached_batches : List [pd .DataFrame ] = []
74-
75- # Unique identifier for HTML table element
76- self ._table_id = str (uuid .uuid4 ())
77- self ._all_data_loaded = False
78- # Renamed from _batch_iterator to _batch_iter to avoid naming conflict
79- self ._batch_iter : Optional [Iterator [pd .DataFrame ]] = None
77+ # Now it's safe to set traitlets properties that trigger observers
78+ self .page_size = initial_page_size
8079
8180 # len(dataframe) is expensive, since it will trigger a
8281 # SELECT COUNT(*) query. It is a must have however.
0 commit comments