Python:类的继承,调用父类的属性和方法基础详解

知乎主页:

知乎主页https://www.zhihu.com/people/shuang-shou-cha-dai-53

备注:这里省略了关于继承含义的解释,直接上代码了,更直观点

  • 子类:Son类
  • 父类:Father类

以下案例均表示Son类继承父类的一些属性和初始化参数构造等。

5个模块:

(1):直接调用父类属性方法

(2):重写父类属性方法

(3):强制调用父类私有属性方法

(4):调用父类的__init__方法

(5):继承父类初始化过程中的参数

(1)调用父类属性方法

代码1.1:

class Father():
    def __init__(self):
        self.a='aaa'  
    def action(self):
        print('调用父类的方法')

class Son(Father):
    pass

son=Son()     # 子类Son 继承父类Father的所有属性和方法
son.action()  # 调用父类方法
son.a         # 调用父类属性

输出结果:


(2)重写父类属性方法

注意:在上面的例子中,子类Son没有属性和action的方法,所以会从父类调用,那我们再来看看,子类Son有自身的属性和方法的结果是怎样的?

上述代码修改为:

class Father():
    def __init__(self):
        self.a='aaa'
    
    def action(self):
        print('调用父类的方法')

class Son(Father):
    def __init__(self):
        self.a='bbb'
    def action(self):
        print('子类重写父类的方法')

son=Son()     # 子类Son继承父类Father的所有属性和方法
son.action()  # 子类Son调用自身的action方法而不是父类的action方法
son.a

输出结果:

这里,子类Son已经重写了父类Father的action的方法,并且子类Son也有初始化,因此,子类会调用自身的action方法和属性。总结:如果子类没有重写父类的方法,当调用该方法的时候,会调用父类的方法,当子类重写了父类的方法,默认是调用自身的方法。

另外,如果子类Son重写了父类Father的方法,如果想调用父类的action方法,可以利用super()

代码2.1:

#如果在重新父类方法后,调用父类的方法
class Father():
    def action(self):
        print('调用父类的方法')

class Son(Father):
    def action(self):
        super().action()
son=Son()
son.action() 

输出结果:


(3)强制调用父类私有属性方法

如果父类的方法是私有方法,如 def __action(self)  这样的话再去调用就提示没有这个方法,其实编译器是把这个方法的名字改成了 _Father__action(),如果强制调用,可以这样:

代码3.1

class Father():
    def __action(self):  # 父类的私有方法
        print('调用父类的方法')

class Son(Father):
    def action(self):
        super()._Father__action()
son=Son()
son.action()

输出结果:


(4)调用父类的__init__方法

如果自己也定义了 __init__ 方法,那么父类的属性是不能直接调用的,比如下面的代码就会报错

代码4.1:

class Father():
    def __init__(self):
        self.a=a

class Son(Father):
    def __init__(self):
        pass
    
son=Son()
print(son.a)

结果报错:

修改方法:可以在 子类的 __init__中调用一下父类的 __init__ 方法,这样就可以调用了

class Father():
    def __init__(self):
        self.a='aaa'

class Son(Father):
    def __init__(self):
        super().__init__()
        #也可以用 Father.__init__(self)  这里面的self一定要加上
son=Son()
print(son.a) 

输出结果:


(5)继承父类初始化过程中的参数

代码5.1:

class Father():
    def __init__(self):
        self.a=1
        self.b=2

class Son(Father):
    def __init__(self):
        super().__init__()
        #也可以用 Father.__init__(self)  这里面的self一定要加上
    def add(self):
        return self.a+self.b
son=Son()
print(son.add())

 输出结果: 

上述代码中,父类在初始化过程中,直接对a,b分别赋值1,2。子类利用super().__init__()继承了父类的初始化参数a和b,所以子类调用自身的add函数(add函数返回a和b的和)会返回结果值。

再看一下,如果不对父类初始化直接赋值,并且子类在调用父类初始化过程中,增加额外自身需要的初始化参数值。

说明:三个参数a,b,c,其中a,b来自父类初始化参数,c表示子类初始化参数,但又分为两种情况:

1):参数c为初始化默认参数,如下面的5.1代码中Son(1,2),参数1,2分别表示a,b的值,默认为c=10,即等于:Son(1,2,10),表明初始化传参过程中c可以不写

2):显式地将初始化参数c修改为其他值,如下面的5.2代码中Son(1,2,1),参数值1,2,1分别表示a,b,c的值,即显式地将c=1传入

具体代码如5.1 , 5.2所示,对比查看:

代码5.1:

class Father():
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def dev(self):
        return self.a - self.b

 #调用父类初始化参数a,b并增加额外参数c
class Son(Father):
    def __init__(self,a,b,c=10):  # 固定值: 例如默认c=10,也可以显示地将c赋值
        Father.__init__(self,a,b)  
        self.c = c
    def add(self):
        return self.a+self.b
    def compare(self):
        if self.c > (self.a+self.b):
            return True
        else:
            return False
        
son=Son(1,2)         # 由于c在初始化过程中默认为10,所以c可以不用显示表达出来
print(son.dev())     # 调用父类dev函数
print(son.add())     # 子类自身add函数
print(son.compare()) # 子类自身compare函数

返回结果:


如果将上述5.1代码中,修改c为其他参数值(非默认值),改成显式地将c值传入

代码5.2:

class Father():
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def dev(self):
        return self.a - self.b

 #调用父类初始化参数a,b并增加额外参数c
class Son(Father):
    def __init__(self,a,b,c=10):  # 固定值: 例如默认c=10,也可以显式地将c赋值
        Father.__init__(self,a,b)  
        self.c = c
    def add(self):
        return self.a+self.b
    def compare(self):
        if self.c > (self.a+self.b):
            return True
        else:
            return False
        
son=Son(1,2,1)     #  显式地将c=1传入子类初始化函数
print(son.dev())     # 调用父类dev函数
print(son.add())     # 子类自身add函数
print(son.compare()) # 子类自身compare函数

输出结果:


附:

(1)Python类的实例化,封装,继承,私有变量和私有方法

(2)Python-实例方法静态方法类方法对比总结

以上基本涵盖了Python类的继承,调用父类的属性和方法基础内容,可以自己动手写些案例,加深理解。

知乎主页

知乎主页https://www.zhihu.com/people/shuang-shou-cha-dai-53

  • 316
    点赞
  • 890
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
Python中的多继承构造方法是指在一个继承多个父类时,如何处理构造方法。在Python中,一个的构造方法是通过`__init__`方法来定义的。当一个子继承多个父类时,它的构造方法可以通过调用父类的构造方法来初始化父类属性。通常使用`super`函数来实现这一点。`super`函数用于调用父类方法,可以在子的构造方法中使用`super().__init__()`来调用父类的构造方法,从而完成对父类属性的初始化。引用中提到了`super`函数和构造方法的相关内容。例如,如果有一个子`MyClass`继承了多个父类,并且每个父类都有自己的构造方法,可以在子的构造方法中使用`super().__init__()`来依次调用父类的构造方法,从而完成对父类属性的初始化。引用中给出了一个带有多个参数的构造方法的示例代码。在这个示例中,`MyClass`的构造方法接受一个参数`name`,并将其赋值给`self.name`。在实例化对象时,可以通过传递参数的方式给构造方法传递参数。最后,引用中提到了继承的概念,即一个可以继承另一个属性方法。在Python中,所有的都默认继承自`object`。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【详解Python中的(多)继承、__init__、__new__、super](https://blog.csdn.net/LittleSeedling/article/details/122798938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [0804Python总结-单继承,多继承,菱形继承,__init__魔术方法(构造方法)](https://blog.csdn.net/qq_45957580/article/details/107827951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值