python学习----8.20面向对象---继承与派生

1.什么是继承

  继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为基类,父类,超类

    继承描述的是一种“遗传”的关系:子类可以重用父类的属性

  

    在python中的继承注意两点:

      1.在python中支持一个子类同时继承多个父类

      2.python中类分为两种:

          新式类:但凡继承object的类,以及该类的子类。。。都是新式类

              在python3中一个类如果没有继承类,默认继承object类,即python3中所有的类都是新式类

          经典类:没有继承object类,以及该类的子类。。。都是经典类

              在python2张总才区分新式类与经典类

2.为什么要使用继承

    减少代码冗余

3.如何使用继承

 

class Parent1(object):
    pass

# print(Parent1.__bases__)

class Parent2:
    pass

class Subclass1(Parent1,Parent2):
    pass

print(Subclass1.__bases__)
View Code

3.1如何在子类派生出的新方法中重用父类

class OldboyPeople:
    school='Oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


class OldboyStudent(OldboyPeople):

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
        self.score=0

    def choose_course(self):
        print('%s is choosing course' %self.name)



class OldboyTeacher(OldboyPeople):

    # def __init__(self,name,age,sex,level):
    #     self.name=name
    #     self.age=age
    #     self.sex=sex
    #     self.level=level

    def score(self,stu,num):
        stu.score=num


stu1=OldboyStudent('李特丹',18,'female') #OldboyPeople.__init__(stu1,'李特丹',18,'female')
print(stu1.__dict__)

tea1=OldboyTeacher('egon',18,'male') ##OldboyPeople.__init__(tea1,'egon',18,'male',10)
print(tea1.__dict__)

  

单继承背景下属性查找的顺序:对象-》对象的类-》父类-》

class Foo:
    # x=333
    pass

class Bar(Foo):
    # x=222
    pass

obj=Bar()
# obj.x=111
print(obj.x)


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

    def f2(self):
        print('Foo.f2')
        self.f1() #obj.f1()

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


obj=Bar()
obj.f2()
'''
Foo.f2
Bar.f1
'''
View Code

多继承背景下属性查找的顺序:对象-》对象的类-》按照从左往右的顺序一个一个的分支找下去

#第四层
class I:
    # x='I'
    pass

#第三层

class E:
    # x='E'
    pass

class F(I):
    # x='F'
    pass

class H:
    x='H'

# 第二层
class B(E):
    # x='B'
    pass

class C(F):
    # x='C'
    pass

class D(H):
    # x='D'
    pass

#第一层
class A(B,C,D):
    # x='A'
    pass

obj=A()
# obj.x=111
print(obj.x)
View Code

一旦出现菱形继承问题,在新式类与经典类在属性查找上的区别是

  新式类:广度优先查找,在最后一个分支查找顶级类

  经典类:深度优先查找,在第一个分支就查找顶级类

class G(object):
    # def test(self):
    #     print('from G')
    pass

# 第三层
class E(G):
    # def test(self):
    #     print('from E')
    pass

class F(G):
    def test(self):
        print('from F')
    pass

# 第二层
class B(E):
    # def test(self):
    #     print('from B')
    pass

class C(F):
    def test(self):
        print('from C')
    pass

class D(G):
    def test(self):
        print('from D')
    pass

# 第一层
class A(B,C,D):
    # def test(self):
    #     print('from A')
    pass

obj=A()
# obj.test()

# 新式类:对象-》A-》B-》E-》C-》F-》D-G
# 经典类:对象-》A-》B-》E-》G-》C-》F-》D
View Code

在子类派生出的新方法中重用父类功能的方式一:

    指名道姓地访问某一个类的函数

注意:

  1.该方法与继承是没有关系的

  2.访问时某一个类的函数,没有自动传值的效果

class OldboyPeople:
    school='Oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


class OldboyStudent(OldboyPeople):

    #           stu1,'李特丹',18,'female'
    def __init__(self,name,age,sex,num=0):
        OldboyPeople.__init__(self,name,age,sex) #OldboyPeople.__init__(stu1,李特丹',18,'female')

        self.score=num

    def choose_course(self):
        print('%s is choosing course' %self.name)



class OldboyTeacher(OldboyPeople):

    def __init__(self,name,age,sex,level):
        OldboyPeople.__init__(self,name,age,sex)

        self.level=level

    def score(self,stu,num):
        stu.score=num


stu1=OldboyStudent('李特丹',18,'female') #OldboyStudent.__init__(stu1,'李特丹',18,'female')
print(stu1.__dict__)

tea1=OldboyTeacher('egon',18,'male',10) ##OldboyTeacher.__init__(tea1,'egon',18,'male',10)
print(tea1.__dict__)
View Code

在子类派生出的新方法中重用父类功能的方式二:只能在子类中用

在python2:super(自己的类名,对象自己)

在python3:super()

调用super()会得到一个特殊的对象,该特殊的对象是专门用来引用父类中的属性的,!!!完全参照mro列表

注意:

   该方式与继承严格依赖于继承的mro列表

   访问是绑定方法,有在自动传值的效果

class OldboyPeople:
    school='Oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


class OldboyStudent(OldboyPeople):

    #           stu1,'李特丹',18,'female'
    def __init__(self,name,age,sex,num=0):
        # OldboyPeople.__init__(self,name,age,sex) #OldboyPeople.__init__(stu1,李特丹',18,'female')
        super(OldboyStudent,self).__init__(name,age,sex)

        self.score=num

    def choose_course(self):
        print('%s is choosing course' %self.name)



class OldboyTeacher(OldboyPeople):

    def __init__(self,name,age,sex,level):
        super().__init__(name,age,sex)

        self.level=level

    def score(self,stu,num):
        stu.score=num


# stu1=OldboyStudent('李特丹',18,'female') #OldboyStudent.__init__(stu1,'李特丹',18,'female')
# print(stu1.__dict__)
#
# tea1=OldboyTeacher('egon',18,'male',10) ##OldboyTeacher.__init__(tea1,'egon',18,'male',10)
# print(tea1.__dict__)
View Code
class A:
    def test(self):
        print('A.test()')
        super().test()

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

class C(B,A):
    pass

obj=C()
# print(C.mro())
#[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
obj.test()
'''
A.test()
from B
'''
View Code
原文地址:https://www.cnblogs.com/Liu-guang-hui/p/9505913.html