Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2018 20:56:44

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

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

Коллеги, поясню возникновение задачи. Пишу программу для численного решения задач с помощью метода конечных элементов (МКЭ). Класс, описывающий стандартный треугольный конечный элемент (КЭ), возвращает матрицу чисел 6х6. Наследник от него - класс, описывающий КЭ пластины, возвращает матрицу 9х9. А класс, описывающий треугольный КЭ оболочки, должен вернуть матрицу 18х18, состоящую из двух предыдущих матриц. Так вот у меня возникла проблема, как при формировании матрицы оболочечного КЭ получить матрицы родительских классов? Если действовать тем способом, который я смоделировал вышеприведенным кодом, то возникают ошибки, связанные с тем, что в объектах от родительских классов значения size и freedom приравниваются к значениям дочернего класса… Ну и все не работает. Как добиться того, чтобы в родительском классе не менялось значение его свойств, заданных в его конструкторе?

Офлайн

#2 Ноя. 29, 2018 21:18:49

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

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

SeregaGomen и чем вас не устраивает мой вариант? у вас size и freedom атрибуты инстанса, и чтобы получить к ним доступ вам нужно создать соответствующие инстансы. В классе наследнике вы переопределяете атрибуты инстанса и инстанс наследника будет иметь уже новые атрибуты, но инстанс родителя будет сохранять свои атрибуты. Если хотите чтобы size и freedom были атрибутами класса так обьявляте их атрибутами класса.

SeregaGomen
Как добиться того, чтобы в родительском классе не менялось значение его свойств, заданных в его конструкторе?
я вас не понимаю от слова “совсем”, в родительском классе ничего не меняется, вы меняете их в наследнике, ваша фееричная конструкция типа “A.get_size(self)” в классе “С” вызывает метод класса “А”, но передает ему первым аргументом инстанс класса “С” в котором значения size и freedom соответвуют классу “С”. если хотите чтобы вам вернуло значения класса “А” так и передавайте ему ссылку на экземпляр класса “А”.
Как вариант сделайте атрибуты size и freedom атрибутами класса, тогда сможете к ним обращаться по имени класса, а не инстанса, по принципу “A.attr_name”.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 29, 2018 21:21:36)

Офлайн

#3 Ноя. 29, 2018 22:14:39

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

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

Спасибо за ответ, но тут есть нюанс. В моем случае код

  
a = A() 
b = B()
привед к значительным накладным расходам, т.к. создание этих объектов требует настройки большого количества параметров, которые уже фактически есть в текущем объекте (который вызывает этот код).

Офлайн

#4 Ноя. 29, 2018 22:32:32

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

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

SeregaGomen
Спасибо за ответ, но тут есть нюанс. В моем случае код
a = A()
b = B()
привед к значительным накладным расходам, т.к. создание этих объектов требует настройки большого количества параметров, которые уже фактически есть в текущем объекте (который вызывает этот код).
Не приведет, если брать существующий пример, то “накладные расходы” это словарь с парой ключей, по сравнению с матрицей 18х18 это вообще ничто. Классы в пайтоне работают очень экономно и не создают сущности сверх необходимого. Или приведите это самое “большое количество параметров которые уже фактически есть в текущем объекте” чтобы мы понимали о чем речь.
Матрицы же вам нужно будет по любому создавать чтобы заполнить итоговую матрицу, правда чтобы не создавать матрицы можно использовать итераторы, но это уже другая история.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version