Python中具有不同参数的继承

2021-06-14 23:36:42 发布

您现在位置:Python中文网/ 问答频道 /正文

当子类从超类继承时,子类必须具有该超类所具有的所有参数吗?E、 g.:“Vehicle(colour,wheels,size)”是超类。我可以有一个子类继承除“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条回答
网友
1楼 ·

子类的__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
网友
2楼 ·

我们定义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子类只接受colorswheels并将其传递给超类,并且具有硬编码的size=small属性。子类构造函数调用超类的构造函数

要检查发生了什么,我们可以尝试以下操作:

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

更新 基于OP不想拥有size属性的注释,您可以为超类中的size属性指定一个默认值,例如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属性的值

相关问题