当子类从超类继承时,子类是否必须具有超类具有的所有参数?例如:“车辆(颜色,车轮,尺寸)”是超类。我可以有一个子类,该子类继承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个必需的位置参数:“荣誉”
答案 0 :(得分: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子类仅接受colors
和wheels
并将其传递给超类,并且具有硬编码的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
属性的值
答案 1 :(得分:0)
对于子类__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