Я перезаписываю свое определение суперкласса в методе подкласса, если я использую то же имя, что и суперкласс? - PullRequest
0 голосов
/ 19 октября 2019

Это продолжение предыдущего вопроса , в котором я слишком усложнял вещи. Зависимость в ООП может быть обеспечена либо наследованием, либо композицией. В этом примере я пытаюсь использовать наследование. Я хотел бы смоделировать следующий простой набор уравнений с ООП:

T = c_v*t/(a*h)**2
U = (T**3/(T**3+0.5))

Используя методы __init__ и __call__ и благодаря эта ссылка , которая показывает элегантный способмоделируя математические функции, используя объектно-ориентированные конструкции, я смог сделать следующее:

class T:
    def __init__(self, c_v, a, h):
        self.c_v = c_v
        self.a = a
        self.h = h
    def __call__(self, t):
        return self.c_v*t/(self.a*self.h)**2

class U(T):

    def __call__(self, t):
        T = super().__call__(t)
        return (T**3/(T**3+0.5) )**(1/6)

Затем следующее:

>>> U_func = U(1.5E-7, 0.5, 12)
>>> U_func(100*24*60*60)

Выводит правильный результат.

Однакострока 12 T = super().__call__(t) меня немного беспокоит. Я перезаписываю определение класса T там? Я действительно не хочу этого делать. Также я не хочу создавать новое имя для T в качестве переменной (не класса).

Ограничен ли T областью действия метода экземпляра или я действительно перезаписываю определение класса T?

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Существуют две разные переменные с именем T:

  1. Класс привязан к имени T в глобальной области видимости текущего модуля.
  2. Экземплярэтот класс связан с именем T в локальной области действия функции U.__call__.

Они полностью разделены, за исключением того, что внутри __call__ вы должны ссылаться накласс с определенным именем, например __name__.T, поскольку локальная переменная T затеняет глобальную.

1 голос
/ 19 октября 2019

Перезаписываю ли я определение класса T там?

Нет. Переменные, назначенные внутри функции, скрыты извне, в своей собственной «области видимости». То, что вы здесь делаете, называется затенением глобальной переменной и не рекомендуется, но не перезаписывает ее. Вместо этого вы должны просто использовать другое имя. Функция назначит переменную только в глобальной области видимости, если вы выполните следующее:

def foo():
    global bar
    bar = 'new value'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...