#python-3.x #inheritance
#python-3.x #наследование
Вопрос:
у меня есть вопрос относительно наследования между дочерним классом и родительским классом. В настоящее время моя текущая __Stack__push()
функция в моем дочернем классе Stack3
не может перезаписать родительскую функцию push. Насколько я знаю из моего понимания, дочерний класс должен перезаписывать то, что было определено в родительском классе. Однако в данном случае этого не происходит.
class Stack:
def __init__(self):
self.__list= []
def isEmpty(self):
return self.__list == []
def size(self):
return len(self.__list)
def clear(self):
self.__list.clear()
def push(self, item):
self.__list.append(item)
def pop(self): # popTail
if self.isEmpty():
return None
else:
return self.__list.pop()
def get(self):
if self.isEmpty():
return None
else:
return self.__list[-1]
def __str__(self):
output = '<'
for i in range( len(self.__list) ):
item = self.__list[i]
if i < len(self.__list)-1 :
output = f'{str(item)}, '
else:
output = f'{str(item)}'
output = '>'
return output
class Stack3(Stack):
def __init__(self,list):
super().__init__()
def push(self, item):
super().push(item)
self.__list = []
self.__list.insert(0,item)
def pop(self):
super().pop()
if self.isEmpty():
return None
else:
return self.__list.pop(0)
# main programme
s= Stack3(Stack())
print(s.pop())
for i in range(1,6):
s.push(i)
print('Content of stack =',s)
print('Item at top=',s.get())
print('Size=', s.size())
while not s.isEmpty():
print(s.pop())
print(s)
Вывод должен был выглядеть примерно так:
None
Content of stack = <5, 4, 3, 2, 1>
Item at top= 5
Size= 5
5
<4, 3, 2, 1>
4
<3, 2, 1>
3
<2, 1>
2
<1>
1
<>
Но мой текущий выглядит так
None
Content of stack = <1, 2, 3, 4, 5>
Item at top= 5
Size= 5
5
<1, 2, 3, 4>
и после этого это выдает мне эту ошибку:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-1-1eecf96bf9ca> in <module>
66 print('Size=', s.size())
67 while not s.isEmpty():
---> 68 print(s.pop())
69 print(s)
<ipython-input-1-1eecf96bf9ca> in pop(self)
53 return None
54 else:
---> 55 return self.__list.pop(0)
56
57 # main programme
IndexError: pop from empty list
Комментарии:
1. это не перезаписывает, потому что имена функций разные, переопределение будет происходить только тогда, когда имена совпадают.
2. @SamridhTuladhar Привет, сэр, даже если я изменил функции на одно и то же имя, я все равно не получил желаемого ответа, и вместо этого он не смог прочитать список. Смотрите обновленный код.
3. это происходит из-за дополнительного списка, который у вас есть по какой-то причине: это вызвано этой строкой
return self.__list.pop(0)
. Пожалуйста, используйте отладчик, чтобы найти эти проблемы 🙂4. ваше наследование уже начало работать, вы можете убедиться в этом сами, добавив дополнительные операторы печати внутри
Stack3
Stack
класса amp; и проверив вывод на консоли. Вам нужно будет разрешить дополнительный список, хотя я не понял его назначения, следовательно, я его не изменил5. я изначально хотел дополнительный список, потому что я понимаю, что
self.__list
это изначально частная переменная в родительском классе и что я не могу получить к ней доступ в частном классе. Поэтому дополнительный список. Но да, я постараюсь найти альтернативу!
Ответ №1:
Итак, после проб и ошибок и поиска в Google, вот мой ответ. Пожалуйста, не стесняйтесь комментировать, что можно изменить!
class Stack:
def __init__(self):
self.__list= []
def isEmpty(self):
return self.__list == []
def size(self):
return len(self.__list)
def clear(self):
self.__list.clear()
def push(self, item):
self.__list.append(item)
def pop(self): # popTail
if self.isEmpty():
return None
else:
return self.__list.pop()
def get(self):
if self.isEmpty():
return None
else:
return self.__list[-1]
def __str__(self):
output = '<'
for i in range( len(self.__list) ):
item = self.__list[i]
if i < len(self.__list)-1 :
output = f'{str(item)}, '
else:
output = f'{str(item)}'
output = '>'
return output
class Stack3(Stack):
def __init__(self,list):
super().__init__()
self.__list = []
def push(self, item):
super().push(item)
self.__list.insert(0,item)
def isEmpty(self):
super().isEmpty()
return self.__list == []
def pop(self):
super().pop()
if self.isEmpty():
return None
else:
return self.__list.pop(0)
def __str__(self):
output = '<'
for i in range( len(self.__list) ):
item = self.__list[i]
if i < len(self.__list)-1 :
output = f'{str(item)}, '
else:
output = f'{str(item)}'
output = '>'
return output
# main programme
s= Stack3(Stack())
print(s.pop())
for i in range(1,6):
s.push(i)
print('Content of stack =',s)
print('Item at top=',s.get())
print('Size=', s.size())
while not s.isEmpty():
print(s.pop())
print(s)