python 继承与抽象

发布时间 2024-01-05 09:21:40作者: -半城烟雨

继承

【一】什么是继承?

继承是一种创建新类的方式,新建的类可以继承一个或多个父类,父类可称为基类或者超类,新建的类称为派生类或子类。子类会“”遗传”父类的属性,从而解决代码重用问题

class School:
    school='希望小学'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def introduce(self):
        print('我是%s,我在%s上学。 '%(self.name,self.school))
class Animals(School):
 
    def animals(self):
        print(f'the animal is zebra')
class student(School):

    def read(self):
        print('Students are reading.')

student1=student('张三',10)

print(student1.school)
student1.introduce()
#希望小学
#我是张三,我在希望小学上学。 

【二】类的特殊方法__ dict__

#查看一个继承的父类
print(student.__base__) <class '__main__.School'>
查看所有继承的父类
print(student.__bases__)
#(<class '__main__.School'>, <class '__main__.Animals'>)

【三】经典类和新式类

  • Python2区分经典类和新式类

    在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类

    在python2中,显式地声明继承object的类,以及该类的子类,都是新式类

  • Python3都是新式类

    在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类

【四】属性查找顺序

  • 属性查找顺序

​ 继承的顺序肯定是从上至下继承

​ 属性查找肯定是从下至上查找

class Foo:
    def f1(self):
        print('Foo.f1')

    # 【2】自己没有就会来到父类里面找,找到了 f2
    def f2(self):
        print(self)  # <__main__.Bar object at 0x000002439F6A2E10>
        # 执行 Foo.f2
        print('Foo.f2')
        # 【3】谁调用的我,那我这个self就是谁
        # Bar() --->  调用的 f2 ---> self 就是 Bar 的对象
        self.f1()


class Bar(Foo):
    # 【4】找打了 自己的 f1
    def f1(self):
        print('Bar.f1')


# 实例化类得到对象
b = Bar()
# 【1】首先 肯定是没有 f2
b.f2()
#<__main__.Bar object at 0x000002B270D9BA60>
Foo.f2
Bar.f1

【五】隐藏属性

  • 隐藏属性 : 隐藏给当前类,除了当前类,其他继承的子类均不能找到我隐藏的属性
class Foo:
    # 变形为_Foo__fa
    def __f1(self):
        print('Foo.f1')

    def f2(self):
        print('Foo.f2')
        # 变形为self._Foo__fa,因而只会调用自己所在的类中的方法
        # _Foo__f1
        self.__f1()
        #
        self._Bar__f1()


class Bar(Foo):
    # 变形为_Bar__f1
    def __f1(self):
        print('Bar.f1')

# _Bar__f1
b = Bar()
# 在父类中找到f2方法,进而调用b._Foo__f1()方法,同样是在父类中找到该方法
b.f2()
#Foo.f2
#Foo.f1
#Bar.f1

【六】深度优先和广度优先

(1)深度优先

  • 当类是经典类(python2)时,多继承情况下,在查找属性不存在时,会按照深度优先的方式查找下去

img

(2)广度优先

  • 当类是新式类python3时,多继承情况下,在查找属性不存在时,会按照广度优先的方式查找下去

img

class A(object):
    def test(self):
        print('from A')


class B(A):
    def test(self):
        print('from B')


class C(A):
    def test(self):
        print('from C')


class D(B):
    def test(self):
        print('from D')


class E(C):
    def test(self):
        print('from E')


class F(D, E):
    # def test(self):
    #     print('from F')
    pass


f1 = F()
f1.test()
# 只有新式才有这个属性可以查看线性列表,经典类没有这个属性
print(F.__mro__)

# 新式类继承顺序:F->D->B->E->C->A
# 经典类继承顺序:F->D->B->A->E->C
# python3中统一都是新式类
# pyhon2中才分新式类与经典类