Наследование в Python с различными аргументами - PullRequest
2 голосов
/ 19 апреля 2019

Когда подкласс наследует от суперкласса, должен ли подкласс иметь все аргументы, которые имеет суперкласс? Например: «Транспортное средство (цвет, колеса, размер)» является суперклассом. Могу ли я иметь подкласс, который наследует все от Vehicle, кроме атрибута / аргумента "size"?

Это родительский класс:

class LagStudent:

    def __init__(self, name, dept, cgpa, is_a_scholar):
        self.name = name
        self.dept = dept
        self.cgpa = cgpa
        self.is_a_scholar = is_a_scholar

Ниже приведены два подкласса:

class CovStudent(LagStudent):

    def __init__(self, name, dept, cgpa, is_a_scholar, honours):
        super().__init__(name, dept, cgpa, is_a_scholar)
        self.honours = honours


class OxStudent(CovStudent):

    def __init__(self, name, dept, cgpa, is_a_scholar):
        super().__init__(name, dept, cgpa, is_a_scholar) 

Когда я запускаю следующее ...

student4 = OxStudent("Mark", "Mathematics", 4.62, True)
print(student4.is_a_scholar)

выдает ошибку:

TypeError: init () отсутствует 1 обязательный позиционный аргумент: 'honors'

Ответы [ 2 ]

2 голосов
/ 19 апреля 2019

Мы определяем суперкласс Vehicle следующим образом, а подкласс Bicycle следующим образом:

class Vehicle:

    def __init__(self, colour, wheels, size):

        self.colour = colour
        self.wheels = wheels
        self.size = size

class Cycle(Vehicle):

    def __init__(self, colour, wheels, size):

        super().__init__(colour, wheels, 'small')

Здесь вы можете видеть, что подкласс Cycle просто принимает значения colors и wheels и передает его в суперкласс,и имеет жестко заданный атрибут size=small.Конструктор подкласса вызывает конструктор суперкласса

. Чтобы проверить, что происходит, мы можем попытаться сделать следующее:

veh = Cycle('Black', 2)
print(veh.colour)
print(veh.wheels)
print(veh.size)
#Black
#2
#small

Обновить На основании комментария OP о нежеланиичтобы иметь атрибут размера, вы можете назначить значение по умолчанию атрибуту размера в суперклассе, например, size=None, и вам не нужно будет передавать его при создании экземпляра подкласса.

class Vehicle:

    def __init__(self, colour, wheels, size=None):

        self.colour = colour
        self.wheels = wheels
        self.size = size

class Cycle(Vehicle):

    def __init__(self, colour, wheels):

        super().__init__(colour, wheels)

Затем вы можетевызовите это следующим образом

veh = Cycle('Black', 2)
print(veh.colour)
print(veh.wheels)
print(veh.size)
#Black
#2
#None

Вы можете видеть, что значение size равно None, что является значением по умолчанию, которое мы выбрали, поскольку мы не передали size явно, если бы мы передалиэто, мы получили бы значение для атрибута size

0 голосов
/ 19 апреля 2019

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

class Vehicle:
    def __init__(self, colour, wheels, size):
        self.colour = colour
        self.wheels = wheels
        self.size = size

class Car(Vehicle):
    def __init__(self, colour, wheels):
        super().__init__(colour, wheels, 'small')

print(Car('white', 4).size)

Это выводит:

small
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...