多继承传入参数的问题?提示找不到父类?提示没有父类的属性?用super有问题?

本文探讨了在Python中多继承情况下如何在子类实例化时传递参数给多个父类。通过示例解释了super()函数的用法,如何通过super调用父类的初始化方法,以确保子类既能拥有自定义属性,又能继承父类的属性。同时,指出了super的限制,即仅能调用直接父类的第一个父类的__init__方法,而无法调用后续父类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多继承,一个子类继承了多个父类。那么多继承如何在子类生成实例时,将参数传入多个父类方法/属性呢?用super吗,好像只能把参数传入第一个继承的父类。

这里学习的多继承与多重继承不一样。这里单纯指一个儿子,继承了母亲和父亲。而没有额外扩展到母亲、父亲又继承了自个儿的爸妈。


#我们知道子类继承了父类的方法,当子类调用一个方法时,优先找子类自己内部,如果没有这个方法,转而再找继承的第一个父类中是否有该方法,然后是第二个父类,依次类推。

#super,格式super(子类,self).__init__(参数1,参数2,参数...),看起来很复杂。

解释起来很简单,当子类希望自定义一些实例属性时,得给子类自个儿编个__init__,但这样就没法继承父类的__init__中的实例属性了,因为子类有了自己的__init__。那如果还想要继承父类的属性,难道要照抄一遍父类的构造方法?

在python新样式中,就可以使用super来重新调用父类的__init__. 

例如:

创建一个爸爸类Car

>>> class Car(): 
def __init__(self,name,brand,color,max_speed):
self.name = name
self.brand = brand
self.color = color
self.max_speed = max_speed
def owner(self):
print('%s拥有一辆小汽车'%self.name)


创建一个Car的儿子类  Tesla,但我希望儿子不是完全继承爸爸,他有特殊的能源供应方式--锂电池。于是我给儿子写了自己的__init__,这时候,父亲的name,brand等实例属性就没有了。那如何能找回来呢?用super(

### Java 泛型通配符 `?` 的用途 Java 泛型中的通配符 `?` 提供了一种灵活的方式来处理未知类型的集合或其他泛型结构。通过使用通配符,可以在保持类型安全的同时增强代码的灵活性。 #### 无界通配符 `<?>` 当不确定或不需要指定具体的类型时,可以使用无界通配符 `<?>`。这表示该位置上的类型是任意的,但一旦声明为 `<?>` 后,就无法向其中添加任何元素(除了 `null`),因为编译器不知道实际的类型是什么[^3]。 ```java public void printList(List<?> list) { for (Object elem : list) { System.out.print(elem + " "); } System.out.println(); } ``` 这段代码展示了如何遍历并打印一个包含任意类型元素的列表,而不必关心具体存储的是什么类型的数据。 #### 上限通配符 `<? extends T>` 上限通配符用于限定泛型参数的具体范围,即所指代的类型必须是指定类型 `T` 或者它的子类。这种方式使得可以从容器中读取数据作为 `T` 类型来使用,但不允许写入新的对象到容器里,除非这些新对象也是 `T` 类型或者是更通用的对象如 `null`[^2]。 ```java public double sumOfNumbers(List<? extends Number> numbers) { double sum = 0.0; for (Number num : numbers) { sum += num.doubleValue(); } return sum; } // 调用示例 List<Integer> integers = Arrays.asList(1, 2, 3); System.out.println(sumOfNumbers(integers)); ``` 此函数能够接受整数、浮点数等各种数值类型的列表,并计算总和。 #### 下限通配符 `<? super T>` 相反地,下限通配符则用来规定泛型参数至少要达到某一层级及以上——也就是说它可以接收给定类型 `T` 自身以及所有超类(`super`)形式的输入。这种情况下允许往里面放入特定类型的实例及其祖先类的实例[^5]。 ```java public static void addElements(List<? super Integer> list) { list.add(1); // 正确:Integer 是 Integer 的子类 list.add(new Object()); // 错误:Object 并不是 Integer 的父类 } ``` 在这个例子中,虽然可以直接向列表中添加 `Integer` 实例,但如果尝试加入其他非继承自 `Integer` 的对象就会报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值