У меня есть код ниже. Class1 присваивает значения спискам (list1, list2, list3). При использовании этих списков внутри Class2 оператор печати, используемый в качестве теста внутри функции calc, печатает пустой список '[]' вместо данных, которые были сохранены внутри него в Class1. Таким образом, вычисление также вернет пустое значение.
class Class2(Class1):
def __init__(self, Class1):
self.arg1 = Class1.arg1
self.arg2 = Class1.arg2
self.arg3 = Class1.arg3
self.arg4 = []
def calc(self, Class1):
for row in Class1.arg1:
self.arg4.append(Class1.list2 + Class1.list3)
print(Class1.arg1)
return self.arg4
cInput = Class1([],[],[])
Test = Class2(cInput ).calc(cInput)
Ниже мой Class1 и пример того, как я заполняю список (Class1 работает правильно)
class Class1:
def __init__(self, list1, list2, list3):
self.arg1= list1
self.arg2= list2
self.arg3= list3
def getList1(filename1):
with open(filename1, "r") as csv1
csvReader1 = csv.DictReader(csv1)
list1= []
for row in zip(csvReader1):
list1.append((row1["arg1"]))
return list1
@DennisPatterson Как мне получить значения, которые я назначил из class1 в class2 вместо пустых списков
Как выглядит ваш Class1?
@DocDriven добавил функцию примера Class1
в getList1 Вы заполняете list1, а затем возвращаете его. Может быть, вы добавляете значения этого списка в self.arg1 или просто забыли это сделать, что привело к вашей проблеме?
@DennisPatterson Когда я вызываю метод getList1, я заполняю его, используя list1 = getList1 ("расположение файла"
@Liights Да, но какой смысл, если вы никогда не обновляете self.arg1. Вы можете менять list1 сколько угодно, это не изменит self.arg1, если вы сами этого не сделаете. Позвольте мне объяснить больше: в class2 вы назначаете его атрибуты значению Class1.arg1, а не list1, который больше является локальной переменной, которая никогда не выходит из Class1. То, что переходит от Class1 к Class2, - это self.arg, и это вы никогда не меняете. Вы меняете только list1, и это не меняет self.arg1
@Liights Я заметил кое-что еще. В вашем коде вы делаете Class2 наследником Class1. Итак, теперь любое свойство в Class1 также находится в Class2. Вам не нужно много копировать вручную.
@DennisPatterson Каким будет правильный способ обновления self.arg1, а не только list1?
@Liights просто сделайте self.arg1.extend(list1) в конце, когда вы закончите заполнять list1
@DennisPatterson Я забыл, что у меня есть строка first_Object = Class1 (list1, list2, list3), это будет правильный способ сделать это?
@Liights Это нормально, но если вы так намерены вручную копировать переменные из class1 в class2, тогда вы хотите сделать: list1 = getList1("filelocation") | self.arg1.extend(list1) И то же самое для 2 и 3. ("|" означает новую строку, поскольку это комментарий) :)
@DennisPatterson добавление self.arg1.extend (list1) создает еще одну проблему. У меня есть функция за пределами Class1, которую я вызываю, чтобы затем вызвать каждую отдельную функцию внутри Class1 (именно там содержатся те две предыдущие строки, которые я упомянул), что означает, что у нее не будет доступа к 'self'
@Liights тогда вам нужно перейти на себя. Вы видите, что это становится сложным и беспорядочным, но это то, что наследование ООП делает за кулисами. Вот почему сделать класс 2 потомком Clas1 проще, чем весь этот беспорядок.
@DennisPatterson Что бы я для этого изменил?
@Liights посмотрите на одобренный ответ.
@DennisPatterson Хотя этот ответ решает множество проблем, мои списки все еще кажутся пустыми. Я, должно быть, что-то где-то упускаю
@Liights Хорошо, я напишу вам четкий ответ. Может быть, тогда вы сможете принять это, поскольку этот вопрос звучит слишком долго
@Liights Подскажите, работает ли это. Я думаю, это то, что вы имели в виду. Если нет - объясните мне что-нибудь. Я с вами здесь весь день :) Также, пожалуйста, прочтите объяснение, чтобы понять, что происходит
@Liights помог мой ответ?
@DennisPatterson Да, в настоящее время работаю, но применяю эти изменения






Вы можете заполнить Class1 с помощью getList1. В вашем примере вы просто инициализируете его пустыми списками.
Когда я вызываю метод getList1, я заполняю его, используя list1 = getList1 ("filelocation")
Я думаю, что есть некоторая путаница в том, как использовать наследование в Python. При наследовании от класса дочерний класс, естественно, имеет доступ к переменным своего родительского класса. Нет необходимости вручную копировать его в функции __init__. Вы можете просто вызвать конструктор родительского элемента через super() и повторно использовать его для дочернего элемента.
class Class1:
def __init__(self, list1, list2, list3):
self.arg1 = list1
self.arg2 = list2
self.arg3 = list3
class Class2(Class1):
def __init__(self, list1, list2, list3):
super().__init__(list1, list2, list3)
self.arg4 = []
def calc(self):
for row in self.arg1:
self.arg4.append(self.arg2 + self.arg3)
print(self.arg1)
return self.arg4
cInput = Class2([], [], [])
Test = cInput.calc()
Я надеюсь, что код устраняет некоторую путаницу. И последнее: вы пытались сделать свой метод getList1 статическим? Таким образом, вы получите ошибку при объявлении функции без ключевого слова self.
После внесения этих изменений и запуска печати все еще печатается []
Это ожидаемое поведение. При создании экземпляра класса вы инициализируете все его переменные как пустой массив. Когда вы вызываете функцию calc, она пропускает цикл for, так как в arg1 нет элементов, которые нужно перебирать. Возвращает пустой список arg4. Если вы хотите это изменить, просто используйте в конструкторе непустые списки.
Разве списки не должны заполняться из Class1, поэтому списки в конструкторе не должны быть пустыми?
Нет, какая строка заставляет вас так думать?
Итак, что вы хотите сделать, это после получения list1 из файла добавить его в self.arg1.
Сделайте так, чтобы Class2 унаследовал все, чтобы вы могли звонить с него напрямую
class Class1:
def __init__(self, list1, list2, list3):
self.arg1= list1
self.arg2= list2
self.arg3= list3
def getList1(self,filename1):
list1 = [1,2,3,4]
self.arg1.extend(list1)
return list1
# another function def getList2(self, filename): ...
# and the last function def getList3(self, filename): ...
class Class2(Class1):
def __init__(self, list1, list2, list3):
super().__init__(list1, list2, list3)
self.arg4 = []
def calc(self):
for row in self.arg1:
self.arg4.append(self.arg2 + self.arg3)
print(self.arg1)
return self.arg4
def populate():
cInput = Class2([], [], [])
list1 = cInput.getList1("filename")
#Do the same with list2 (list2 = cInput.getList2("filename")
#Do the same with list3 (list3 = cInput.getList3("filename")
Test = cInput.calc()
print(Test)
populate()
Class2 имеет все, что есть в Class1, включая методы getList. Итак, что происходит, когда вы создаете экземпляр Class2, он автоматически создает экземпляр Class1 и добавляет его в Class2 (имеет ли это какой-то смысл?)
Итак, теперь класс 2 будет иметь arg1, arg2, arg3 и arg4. Вы вызываете getList для каждого из arg1, 2 и 3, и они заполняются. Затем вы вызываете calculate, чтобы заполнить arg4.
Это много деталей и работает! спасибо также @DocDriven за его ответ
В чем именно заключается ваш вопрос?