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

SeregaGomen
Как добиться того, чтобы в родительском классе не менялось значение его свойств, заданных в его конструкторе?
я вас не понимаю от слова “совсем”, в родительском классе ничего не меняется, вы меняете их в наследнике, ваша фееричная конструкция типа “A.get_size(self)” в классе “С” вызывает метод класса “А”, но передает ему первым аргументом инстанс класса “С” в котором значения size и freedom соответвуют классу “С”. если хотите чтобы вам вернуло значения класса “А” так и передавайте ему ссылку на экземпляр класса “А”.
Как вариант сделайте атрибуты size и freedom атрибутами класса, тогда сможете к ним обращаться по имени класса, а не инстанса, по принципу “A.attr_name”.
SeregaGomen
Спасибо за ответ, но тут есть нюанс. В моем случае код
  
a = A() 
b = B()
привед к значительным накладным расходам, т.к. создание этих объектов требует настройки большого количества параметров, которые уже фактически есть в текущем объекте (который вызывает этот код).
PEHDOM
SeregaGomen
Спасибо за ответ, но тут есть нюанс. В моем случае код
a = A()
b = B()
привед к значительным накладным расходам, т.к. создание этих объектов требует настройки большого количества параметров, которые уже фактически есть в текущем объекте (который вызывает этот код).
Не приведет, если брать существующий пример, то “накладные расходы” это словарь с парой ключей, по сравнению с матрицей 18х18 это вообще ничто. Классы в пайтоне работают очень экономно и не создают сущности сверх необходимого. Или приведите это самое “большое количество параметров которые уже фактически есть в текущем объекте” чтобы мы понимали о чем речь.
Матрицы же вам нужно будет по любому создавать чтобы заполнить итоговую матрицу, правда чтобы не создавать матрицы можно использовать итераторы, но это уже другая история.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB