类的继承和多态

继承

1、什么是继承?

继承是一种新建类的方式

新建的类称之为类或者派生类,

父类又可以称之为基类或者超类

子类会‘遗传’父类的属性

继承是类与类之间的关系,寻找这种关系需要先抽象再继承

2、为什么要用继承

减少代码冗余

3、怎么用继承

class parentclass1:
    pass
class parentclass2:
    pass
class subclass1(parentclass1):
    pass
class subclass2(parentclass1,parentclass2):#这就是继承上面
    pass


print(subclass2.__bases__)#这个bases就是查看有几个‘爹’的

那我们能从“爹”那里能继承什么呢?

class parent1:
    school=‘oldboy’
    def __init__(self, name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class parent2:
  school='oldboy'
  def __init__(self,name,age,sex):
    self.name=name
    self.age=age
    self.sex=sex
class son1(parent1): def f1(self): print('%s son1'%self.name) class son2(parent1,parent2): def f2(self): print('%s son2'%self.name)

猜一猜  f2中的f1,调用的到底是哪里的?是自己的还是儿子的

调用的是儿子辈的。不是根据就近原则找自己的而是找儿子的

class foo():          #
    def f1(self):
        print('fool.f1')
    def f2(self):
        print('foo.f2')
        self.f1()

class bar(foo):    #儿子
    def f1(self):
        print('bar.f1')    

派生:子类定义自己新的属性,如果与父辈同名,以子类自己为准

class OldboyPeople:
#     school = 'oldboy'
#
#     def __init__(self, name, age, sex):
#         self.name = name
#         self.age = age
#         self.sex = sex
#
#     def f1(self):
#         print('爹的f1')
class OldboyTeacher(OldboyPeople): # def change_score(self): # print('teacher %s is changing score' %self.name) # # def f1(self): # print('儿子的f1') # # tea1 = OldboyTeacher('egon', 18, 'male') # tea1.f1(class OldboyPeople:
    school = 'oldboy'
class OldboyPeople:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def f1(self):
        print('爹的f1')

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):#应用自己的,不用父辈了
self.name
=name self.age=age self.sex=sex self.level=level self.salary=salary def change_score(self): print('teacher %s is changing score' %self.name) def f1(self): print('儿子的f1') tea1 = OldboyTeacher('egon', 18, 'male',9,3.1) print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)

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

方法一:指名道姓地调用(其实与继承没有什么关系的)

OldboyPeople.__init__(self,name, age, sex)

# class OldboyPeople:
#     school = 'oldboy'
#
#     def __init__(self, name, age, sex):
#         self.name = name
#         self.age = age
#         self.sex = sex
#
#     def tell_info(self):
#         print("""
#         ===========个人信息==========
#         姓名:%s
#         年龄:%s
#         性别:%s
#         """ %(self.name,self.age,self.sex))
#
#
# class OldboyTeacher(OldboyPeople):
#     #            tea1,'egon', 18, 'male', 9, 3.1
#     def __init__(self, name, age, sex, level, salary):
#         # self.name = name
#         # self.age = age
#         # self.sex = sex
#         OldboyPeople.__init__(self,name, age, sex)#指名道姓的应用
#
#         self.level = level
#         self.salary = salary
#
#     def tell_info(self):
#         OldboyPeople.tell_info(self)
#         print("""
#         等级:%s
#         薪资:%s
#         """ %(self.level,self.salary))
#
# tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
# # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
#
#
# tea1.tell_info()

方法二:super()调用(严格依赖于继承)

super()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性

#了解再python2中,需要super(自己的类名,self)

class OldboyPeople:
    school = 'oldboy'

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

    def tell_info(self):
        print("""
        ===========个人信息==========
        姓名:%s
        年龄:%s
        性别:%s
        """ %(self.name,self.age,self.sex))


class OldboyTeacher(OldboyPeople):
    #            tea1,'egon', 18, 'male', 9, 3.1
    def __init__(self, name, age, sex, level, salary):
        # OldboyPeople.__init__(self,name, age, sex)
        super(OldboyTeacher,self).__init__(name,age,sex)

        self.level = level
        self.salary = salary

    def tell_info(self):
        # OldboyPeople.tell_info(self)
        super().tell_info()
        print("""
        等级:%s
        薪资:%s
        """ %(self.level,self.salary))

tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
# print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
tea1.tell_info()

二、经典类与新式类

1、新式类:

  继承object的类,以及该类的子类,都是新式类,在python3中,如果一个类没有指定继承父辈,默认就继承object

所以说python3中所有的类都是新式类

2、经典类:

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

三、在棱形继承背景下,super严格按照查找属性

1、经典类:深度优先

先f--》d--》b--》a 找到了就不找了。一条道路走到黑

2、新式类:广度优先

先f--》d--》b--》e--》c--》a 按照菱形找

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

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

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

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

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

# F->D->B->E->C-A->object

print(F.mro())
原文地址:https://www.cnblogs.com/wuchenyu/p/8809078.html