Al Lelopath
Al Lelopath

Reputation: 6778

Create a list that can be accessed from multiple classes

I'm trying to create a list that is populated in one class and read in another class. I have a number of things, right now I'm getting the error shown below. I show only one class where the list is read, but there will be others.
How do I do this?

ReadDatabase.py

class ReadDatabase(object):

    f_type_list = ReadDatabase.getFTypes() ## 'ReadDatabase' not defined

    @staticmethod
    def getFTypes():
        <reads from database>
        return my_list

MyTreeView.py

from ReadDatabase import *
class MyTreeView (ttk.Treeview):

    def __init__(self,  frame=None, list=[], column_headers=[]):
        for f_type in ReadDatabase.f_type_list:
           <do stuff> 

Upvotes: 0

Views: 981

Answers (1)

You can separate it into two different classes in two different ways.

Example 1: Using two classes, one class (A) creates & updates the list and the other class (B) creates an instance of A and controls it:

class A:
    """
    Create and updates the list
    """
    def __init__(self):
        self.my_list = []
        self._read_from_database()

    def _read_from_database(self):
        # some database update logic
        self.my_list.append(3)

class B:
    """
    Creates an instance of A and can read from it.
    """
    def __init__(self):
        self.a = A()
    def print_list(self):
        for index, element in enumerate(self.a.my_list):
            print(f"Index: {index} Element: {element}")

b_object = B()
b_object.print_list() # Prints: Index: 0 Element: 3

or
Example 2: You can just create a method in class B and just pass it the lst from class A:

class A:
    """
    Create and updates the list
    """
    def __init__(self):
        self.my_list = []
        self._read_from_database()

    def _read_from_database(self):
        # some database update logic
        self.my_list.append(3)

class B:
    def __init__(self):
        pass
    def print_list(self, lst):
        for index, element in enumerate(lst):
            print(f"Index: {index} Element: {element}")


a_object = A()
b_object = B()
b_object.print_list(a_object.my_list)

You can also pass the entire instance of A to B for it to use if you wanted to do it that way.

Upvotes: 1

Related Questions