Python单继承的简单理解

一、先看个简单的例子

class A:
    def __init__(self,name):
        self.name = name
    def haha(self):
        print("方法a")

class B(A):
    pass

b =  B()

以上代码,B继承了A,B中没有定义任何属性,但是当直接实例化B时,执行此文件,会提示:

Traceback (most recent call last):
  File "test01.py", line 10, in <module>
    b =  B()
TypeError: __init__() missing 1 required positional argument: 'name'

以上提示少’name’这个参数,因为B继承了A,所以name这个属性,B也是具有的,其中B也具有haha这个方法。那么正确的实例化应该是:

b = B("yxi")

二、进阶

对以上例子进行稍微的修改,给B中也添加__init__初始化方法,并赋予age属性

class A:
    def __init__(self,name):
        self.name = name
        print("name:",self.name)
    def a(self):
        print("方法a")

class B(A):
    def __init__(self,age):
        self.age = age
        print(self.age)

b =  B(23)

以上代码输出结果为23,跟name属性没有任何关系,并且不具有name这个属性了,因为子类的__init__方法会将父类的初始化方法覆盖。那么问题来了,我不想覆盖父类的属性,父类的属性我还要用,怎么做呢?看下面写法:

class A:
    def __init__(self,name):
        self.name = name
        print("name:",self.name)
    def a(self):
        print("方法a")

class B(A):
    def __init__(self,name,age):
        self.age = age
        super().__init__(name)
        print(self.name,self.age)

b =  B("yxi",22)

输出:

name: yxi
yxi 22

其中可以看出,在B中的__init__方法中,多传入一个name参数,并且这个name就是通过super().init(name)引入了父类的name属性。或者通过A.init(self,name)的方式传入也可以。(前面的两个init,应该含有双下划线,不知道这里怎么调,写法以代码块中为准,,哈哈哈)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值