Форум сайта python.su
0
Коллеги, доброго времени суток!
Вопрос у меня такой (извиняюсь за нелаконичность).
Есть класс А, в котором, например, создается матрица размера 5х5 (соответственно в нем есть свойство self.size = 5). От данного класса создается наследник В, создающий матрицу 10х10. Свойство self.size = 10 в данном классе. Мне нужно сделать класс С, являющийся наследником А и В (или только В?), в котором, например, создается матрица размером 15х15, состоящая из элементов матриц классов А и В. Когда я в методе класса С, генерирующем матрицу, вызываю соответствующие методы классов А и В для создания их матриц, то получаю ошибки, связанные с тем, что свойство self.size у меня равно теперь 15 даже внутри методов родительский классов.
Как мне вызвать родительские методы таким образом, чтобы значения переменных (свойств) в них соответствовали этим классам, а не их потомку?
P.S. В С++ с этим проблем нет…
Офлайн
857
SeregaGomenНу привёл бы пример на C++, а мы бы посмотрели.Так-то по описанию видно, что там какой-то бред. Проходить наверх по дереву наследования в питоне можно, но тут само дерево наследования под вопросом. Что ты пытаешься сделать с помощью такого наследования?
P.S. В С++ с этим проблем нет…
Офлайн
294
SeregaGomenдавайте как вы приведете нам то что вы наваяли, потому как непонятно какие методы вы вызываете и куда и откуда.
Когда я в методе класса С, генерирующем матрицу, вызываю соответствующие методы классов А и В для создания их матриц, то получаю ошибки, связанные с тем, что свойство self.size у меня равно теперь 15 даже внутри методов родительский классов.
class A: def __init__(self): self.__size = 5 def sizeA(self): return(self.__size) class B(A): def __init__(self): super().__init__() self.__size = 10 def sizeB(self): return(self.__size) class C(B): def __init__(self): super().__init__() self.__size = 15 def sizeC(self): return(self.__size) c=C() print('class A size: {}, class B size: {}, class C size: {}'.format(c.sizeA(), c.sizeB(), c.sizeC())) >>> class A size: 5, class B size: 10, class C size: 15 >>>
[code python][/code]
Отредактировано PEHDOM (Ноя. 27, 2018 14:02:08)
Офлайн
0
Вот пример моего кода:
from numpy import array, zeros
class A:
def __init__(self):
self.size = 5
self.freedom = 2
def get_size(self):
return self.size
def get_freedom(self):
return self.freedom
def gen(self):
a = zeros()
for i in range(0, self.size*self.freedom):
for j in range(0, self.size*self.freedom):
a = 1
return a
class B(A):
def __init__(self):
super().__init__()
self.size = 5
self.freedom = 3
def gen(self):
a = zeros()
for i in range(0, self.size*self.freedom):
for j in range(0, self.size*self.freedom):
a = 2
return a
class C(B):
def __init__(self):
super().__init__()
self.size = 30
self.freedom = 6
def gen(self):
a = zeros()
b = A.gen(self)
c = B.gen(self)
for i in range(0, A.get_size(self)*A.get_freedom(self)):
for j in range(0, A.get_size(self)*A.get_freedom(self)):
a = b
for i in range(0, B.get_size(self)*B.get_freedom(self)):
for j in range(0, B.get_size(self)*B.get_freedom(self)):
a = c
return a
if __name__ == ‘__main__’:
c = C()
print(c.gen())
При поптыке его выполнения выдает ошибку, связанную с тем, что когда выполняется код “b = A.gen(self)” в классе А значение свойста freedom не 2 а 6!
Или я что-то не пониаю, или как это исправить!? 
Офлайн
0
P.S. Прошу простить меня, не доглядел, что в коде пропали отступы. Сейчас попробую это поправить…
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from numpy import array, zeros
class A:
def __init__(self):
self.size = 5
self.freedom = 2
def get_size(self):
return self.size
def get_freedom(self):
return self.freedom
def gen(self):
a = zeros()
for i in range(0, self.size*self.freedom):
for j in range(0, self.size*self.freedom):
a = 1
return a
class B(A):
def __init__(self):
super().__init__()
self.size = 5
self.freedom = 3
def gen(self):
a = zeros()
for i in range(0, self.size*self.freedom):
for j in range(0, self.size*self.freedom):
a = 2
return a
class C(B):
def __init__(self):
super().__init__()
self.size = 30
self.freedom = 6
def gen(self):
a = zeros()
b = A.gen(self)
c = B.gen(self)
for i in range(0, A.get_size(self)*A.get_freedom(self)):
for j in range(0, A.get_size(self)*A.get_freedom(self)):
a = b
for i in range(0, B.get_size(self)*B.get_freedom(self)):
for j in range(0, B.get_size(self)*B.get_freedom(self)):
a = c
return a
if __name__ == ‘__main__’:
c = C()
print(c.gen())
Офлайн
0
Странно, но не помогло…
Офлайн
27
Оберните код в тег. Рядом со смайликом есть значок с треугольными скобками, он создаст тег.
Офлайн
0
#!/usr/bin/env python # -*- coding: utf-8 -*- from numpy import array, zeros class A: def __init__(self): self.size = 5 self.freedom = 2 def get_size(self): return self.size def get_freedom(self): return self.freedom def gen(self): a = zeros([self.size*self.freedom, self.size*self.freedom]) for i in range(0, self.size*self.freedom): for j in range(0, self.size*self.freedom): a[i][j] = 1 return a class B(A): def __init__(self): super().__init__() self.size = 5 self.freedom = 3 def gen(self): a = zeros([self.size*self.freedom, self.size*self.freedom]) for i in range(0, self.size*self.freedom): for j in range(0, self.size*self.freedom): a[i][j] = 2 return a class C(B): def __init__(self): super().__init__() self.size = 30 self.freedom = 6 def gen(self): a = zeros([self.size*self.freedom, self.size*self.freedom]) b = A.gen(self) c = B.gen(self) for i in range(0, A.get_size(self)*A.get_freedom(self)): for j in range(0, A.get_size(self)*A.get_freedom(self)): a[i][j] = b[i][j] for i in range(0, B.get_size(self)*B.get_freedom(self)): for j in range(0, B.get_size(self)*B.get_freedom(self)): a[i + A.get_size(self)*A.get_freedom(self)][j + A.get_size(self)*A.get_freedom(self)] = c[i][j] return a if __name__ == '__main__': c = C() print(c.gen())
Офлайн
221
SeregaGomen
ну самое простое что я могу посоветовать это сделать так
def gen(self, size=None): size = size if size is not None else self.size ...
Офлайн
294
м-м-м-да… вот это просто жесть, долго чесал “тыкву” пытаясь понять что же именно вы делаете вот этими всеми строками:
class C(B): ...... b = A.gen(self) c = B.gen(self) .... A.get_size(self)*A.get_freedom(self)
Но потом понял что это все лишнее. #!/usr/bin/env python # -*- coding: utf-8 -*- from numpy import array, zeros class A: def __init__(self): self.size = 2 self.freedom = 1 def get_size(self): return self.size def get_freedom(self): return self.freedom def gen(self): a = zeros([self.size*self.freedom, self.size*self.freedom]) for i in range(0, self.size*self.freedom): for j in range(0, self.size*self.freedom): a[i][j] = 1 return a class B(A): def __init__(self): super().__init__() self.size = 3 self.freedom = 1 def gen(self): a = zeros([self.size*self.freedom, self.size*self.freedom]) for i in range(0, self.size*self.freedom): for j in range(0, self.size*self.freedom): a[i][j] = 2 return a class C(B): def __init__(self): super().__init__() self.size = 5 self.freedom = 1 def gen(self): c = zeros([self.size*self.freedom, self.size*self.freedom]) a = A() b = B() a_matrix = a.gen() b_matrix = b.gen() for i in range(0, a.get_size()*a.get_freedom()): for j in range(0, a.get_size()*a.get_freedom()): c[i][j] = a_matrix[i][j] for i in range(0, b.get_size()*b.get_freedom()): for j in range(0, b.get_size()*b.get_freedom()): c[i + a.get_size()*a.get_freedom()][j + a.get_size()*a.get_freedom()] = b_matrix[i][j] return c if __name__ == '__main__': c = C() print(c.gen()) >>> [[ 1. 1. 0. 0. 0.] [ 1. 1. 0. 0. 0.] [ 0. 0. 2. 2. 2.] [ 0. 0. 2. 2. 2.] [ 0. 0. 2. 2. 2.]] >>>
[code python][/code]
Отредактировано PEHDOM (Ноя. 29, 2018 16:02:22)
Офлайн