Я пытаюсь создать список, который заполняется в одном классе и читается в другом классе. У меня есть несколько вещей, прямо сейчас я получаю сообщение об ошибке, показанное ниже. Я показываю только один класс, где читается список, но будут и другие.
Как мне это сделать?
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>
Или вы можете иметь функцию посредника, читающую из одного класса и передавать ее другому...
Мне нравится звучание вашего первого предложения. Можете ли вы показать, как, пожалуйста?
Вы можете разделить его на два разных класса двумя разными способами.
Пример 1: Используя два класса, один класс (A
) создает и обновляет список, а другой класс (B
) создает экземпляр 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:
"""
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
или
Пример 2: Вы можете просто создать метод в классе B
и просто передать ему lst
из класса 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)
Вы также можете передать весь экземпляр A
в B
, чтобы он использовал его, если вы хотите сделать это таким образом.
Почему бы просто не создать один класс (класс A) и не заполнить список с помощью конструктора и метода соответственно, а другой класс (класс B) создать экземпляр A и прочитать список A с помощью вызова метода? (или @свойство)