python--继承

继承:
实现代码的重用,相同的代码不需要重复的编写。
其中子类中拥有父类的所有方法和属性。
当父类的方法不能满足子类需求时,可对方法进行重写
重写的方法有:
1、覆盖父类的方法
2、对父类方法进行扩展。

单继承
一、覆盖父类的方法
在子类中定义一个与父类同名的方法且实现,重写之后,在运行时,只会调用子类中重写的方法,而不会调用父类的方法。
在这里插入图片描述

class Dog():
    def bark(self):
        print("汪汪吠叫")
dog=Dog()
dog.bark()

class Xiaotianquan(Dog):
    def fly(self):
        print("飞")
    def bark(self):
        print("吠叫声很大")
xtq=Xiaotianquan()
xtq.bark()
汪汪吠叫
吠叫声很大

二、对父类方法进行扩展
1、像之前一样重写子类
2、super(程序后面会给你自动添加
3、针对子类的需求编写子类代码

class Xiaotianquan(Dog):
    def fly(self):
        print("飞")
    def bark(self):
        print("吠叫声很大")
        super(Xiaotianquan, self).bark()
        print("&*&%")
吠叫声很大
汪汪吠叫
&*&%

2.访问私有属性和方法
1、在外界不能直接访问父类的私有属性/调用私有方法

class A():
    def test(self):
        self.num=100
        self.__num2=200
    def __test(self):
        print("私有方法{}{}".format(self.num,self.__num2))


class B(A):
    pass
b=B()
print(b)
print(b.__num2)

AttributeError: 'B' object has no attribute '__num2'

class B(A):
    def demo(self):
        #1.在子类的对象方法中,不能访问父类的私有属性
        print("访问父类的私有属性{}".format(self.__num2))
        #2.在子类的对象方法中,调用父类的私有方法
        self.__test()

2、子类可以通过父类的公有方法间接访问到私有属性和方法。由于私有属性和方法是对象的隐私,不对外公开,外界和子类都不能直接访问。
在这里插入图片描述
父类有一个公有方法test,在这个test方法中访问自己的属性num,__num2.然后在公有方法里面调用自己的私有方法——test
因此作为子类对象是可以调用父类的公有方法的。
例子:

class A():
    def __init__(self):
        self.num=100
        self.__num2=400
    def __test(self):
        print("父类的私有属性是输出num{} 与__num2 {}的值".format(self.num,self.__num2))
    def test(self):
        print("父类的公有方法 {}".format(self.__num2))
        print("这一步完成后调用父类自己的私有方法")
        self.__test()#父类自己可以调用自己的方法

class B(A):
    def demo(self):
        print("子类方法 {}".format(self.num))
        self.test()

b=B()
print(b.demo())

多继承:
可以让子类对象同时拥有多个父类的属性和方法
语法:
class 子类名(父类a,父类b):
pass

class A():
    def test(self):
        print("A类的继承方法")
class B():
    def demo(self):
        print("B类的继承方法")
class C(A,B):
    pass
c=C()#创建了子类对象
c.test()
c.demo()
A类的继承方法
B类的继承方法

问题的提出,如果多个父类有相同的属性和方法,怎么处理呢?
—尽量避免使用多继承
程序只执行最前面的父类

class A():
    def test(self):
        print("A类----test方法")
    def demo(self):
        print("A类-----demo方法")
class B():
    def test(self):
        print("B类----test方法")
    def demo(self):
        print("B类-----demo方法")
class C(A,B):
    pass
c=C()
c.test()
c.demo()

结果如下;

A类----test方法
A类-----demo方法
class C(B,A):
    pass

结果如下:

B类----test方法
B类-----demo方法

简单了解python中的内置方法__mro__(方法搜索顺序)
输出结果按照从左到右的顺序查找

...
print(C.__mro__)
B类----test方法
B类-----demo方法
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

3、由于python2与python3的区别,我们在定义类的时候如果没有父类,采用object
格式如下;
class 类名(object)
pass
在终端中可以用dir函数查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值