Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 24, 2018 20:33:48

SeregaGomen
Зарегистрирован: 2017-06-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

Коллеги, доброго времени суток!
Вопрос у меня такой (извиняюсь за нелаконичность).
Есть класс А, в котором, например, создается матрица размера 5х5 (соответственно в нем есть свойство self.size = 5). От данного класса создается наследник В, создающий матрицу 10х10. Свойство self.size = 10 в данном классе. Мне нужно сделать класс С, являющийся наследником А и В (или только В?), в котором, например, создается матрица размером 15х15, состоящая из элементов матриц классов А и В. Когда я в методе класса С, генерирующем матрицу, вызываю соответствующие методы классов А и В для создания их матриц, то получаю ошибки, связанные с тем, что свойство self.size у меня равно теперь 15 даже внутри методов родительский классов.

Как мне вызвать родительские методы таким образом, чтобы значения переменных (свойств) в них соответствовали этим классам, а не их потомку?
P.S. В С++ с этим проблем нет…

Офлайн

#2 Ноя. 25, 2018 02:44:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

SeregaGomen
P.S. В С++ с этим проблем нет…
Ну привёл бы пример на C++, а мы бы посмотрели.Так-то по описанию видно, что там какой-то бред. Проходить наверх по дереву наследования в питоне можно, но тут само дерево наследования под вопросом. Что ты пытаешься сделать с помощью такого наследования?



Офлайн

#3 Ноя. 27, 2018 13:45:58

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

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)

Офлайн

#4 Ноя. 29, 2018 09:22:06

SeregaGomen
Зарегистрирован: 2017-06-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

Вот пример моего кода:

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!
Или я что-то не пониаю, или как это исправить!?

Офлайн

#5 Ноя. 29, 2018 09:23:35

SeregaGomen
Зарегистрирован: 2017-06-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

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())

Офлайн

#6 Ноя. 29, 2018 09:24:13

SeregaGomen
Зарегистрирован: 2017-06-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

Странно, но не помогло…

Офлайн

#7 Ноя. 29, 2018 09:51:15

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

Оберните код в тег. Рядом со смайликом есть значок с треугольными скобками, он создаст тег.

Офлайн

#8 Ноя. 29, 2018 10:00:24

SeregaGomen
Зарегистрирован: 2017-06-24
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

 #!/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())

Офлайн

#9 Ноя. 29, 2018 12:58:32

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

SeregaGomen
ну самое простое что я могу посоветовать это сделать так

 def gen(self, size=None):
        size = size if size is not None else self.size
         ...
а в классе C вызывать явно передавая параметр size



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Ноя. 29, 2018 15:45:50

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Вызов методов родительского класса с учетом значений его свойств

м-м-м-да… вот это просто жесть, долго чесал “тыкву” пытаясь понять что же именно вы делаете вот этими всеми строками:

 class C(B):
   ......
    b = A.gen(self)
    c = B.gen(self)
     ....
    A.get_size(self)*A.get_freedom(self)
Вы не представляете как работают классы в пайтоне?
Сначал хотел посоветовать сделать атрибуты size и freedom атрибутами класса, а не инстанса, или если вы хотите, по какойто причине, чтобы это были таки атрибуты инстанса, защищать их от переопределения с помощью “__” перед именем атрибута. Есть еще совсем извращенный вариант, сдеть gen() статическим методом, а get_freedom() и get_size() методами класса Но потом понял что это все лишнее.
чутка уменьшил размеры матриц ибо для примера это не важно, классы А и B вобще не трогал, :
  #!/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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version