Наследование от суперкласса до подклассов в Python - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть суперкласс, который имеет некоторые атрибуты класса, такие как:

class Config(object):    
    LENGTH = 1
    BREADTH = 3

Теперь я создал подкласс, который будет переопределять атрибуты родительского класса.

 class Sub1(Config):
     def __init__():
        self.LENGTH = 200
        self.BREADTH = 100
        self.AREA = self.LENGTH * self.BREADTH 

Теперь янужно написать другой подкласс, который будет перезаписывать значения первого подкласса.Здесь я должен наследовать от родительского класса Config или я могу перезаписать значения в самом подклассе и изменить его.

class Sub2(Sub1):
   self.AREA_UPDATED = self.AREA + 20

Это не работает.

class Sub2(Config):
    self.LENGTH = "efg"
    self.BREADTH = 100
    self.AREA = self.LENGTH * self.BREADTH
    self.AREA_UPDATED = self.AREA + 20

Это работает.Что я делаю концептуально неправильно, так что родительский класс может быть унаследован только?Добрый совет.

Спасибо

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Вы не можете использовать self в области действия class.Вы должны просто использовать имя переменной просто так:

class Sub2(Config):
    LENGTH = "efg"
    BREADTH = 100
    AREA = LENGTH * BREADTH
    AREA_UPDATED = AREA + 20

Потому что таким образом вы будете перезаписывать атрибуты класса, а не только атрибуты экземпляра, как вы это делали в __init__.

Наследуя от Sub1, вы можете сделать то же самое:

class Sub1(Config):
    LENGTH = 200
    BREADTH = 100
    AREA = LENGTH * BREADTH 

class Sub2(Sub1):
    AREA_UPDATED = Sub1.AREA + 20
0 голосов
/ 18 декабря 2018

Поправьте меня, если я ошибаюсь, но разве вы не используете ширину и ширину в init , чтобы правильно создать экземпляр объекта?Я имею в виду именно так:

class Config(object):
   def __init__(self, width, breadth):
       self.width = width
       self.breadth = breadth
       self.area = width*breadth

взятие конфига в качестве суперкласса (вы также можете использовать его как абстрактный базовый класс, в этом случае мое решение будет неправильным).

И потомпросто правильно пусть Sub1 наследуется от Config следующим образом:

class Sub1(Config):
  def __init__(self,width,breadth):
      Config.__init__(self,width,breadth)
      self.area = width * breadth

для sub2 вы, очевидно, можете сделать то же самое.Если вы хотите узнать обновленную область, вы можете просто использовать сеттеры для атрибутов, которые имеет класс.

0 голосов
/ 18 декабря 2018

Изменить

class Sub2(Sub1):
   self.AREA_UPDATED = self.AREA + 20

на

class Sub2(Sub1):
  def __init__(self):
     self.AREA_UPDATED = self.AREA + 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...