继承与派生

第1章 继承与派生

1.1  什么是继承

继承一种新建类的的方式,在python中支持一个儿子继承多个爹

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

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

子类会”遗传“父类的属性

 

1.2 为什么要用继承

减少代码冗余

 

1.3 怎么用继承

示例:

class ParentClass1:

    pass

 

class ParentClass2:

    pass

 

class Subclass1(ParentClass1):

    pass

 

class Subclass2(ParentClass1,ParentClass2):

    pass

 

# print(Subclass1.__bases__)

print(Subclass2.__bases__)
View Code

了解:

# 在python2中有经典类与新式类之分

# 在python3中全都为新式类

 

1.4 寻找继承的关系

'''

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

 

'''

class OldboyPeople:

    school = 'oldboy'

 

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

        self.name = name

        self.age = age

        self.sex = sex

 

 

class OldboyTeacher(OldboyPeople):

    def change_score(self):

        print('teacher %s is changing score' %self.name)

 

class Oldboystudent(OldboyPeople):

    def choose(self):

        print('student %s choose course' %self.name)

 

 

tea1 = OldboyTeacher('egon', 18, 'male') #OldboyTeacher.__init__(...)

stu1=Oldboystudent('alex',73,'female')

 

print(tea1.name,tea1.age,tea1.sex)

# print(stu1.name)

 

1.5 基于继承在看属性查找

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)

 

tea1 = OldboyTeacher('egon', 18, 'male')

# print(tea1.__dict__)

# print(tea1.name)

# print(tea1.school)

# print(tea1.change_score)

# print(tea1.f1)
View Code

 

1.6 派生

1.6.1 什么是派生?

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

# 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'

 

    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)

 
View Code

 

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

1.7.1 方式一:指名道姓的使用

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()
示例

 

 

 

1.7.2 方式二: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.8 经典类与新式类

'''

1、新式类:

    继承object的类,以及该类的子类,都是新式类

 

    在python3中,如果一个类没有指定继承的父类,默认就继承object

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

 

2、经典类(只有在python2才区分经典类与新式类):

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

'''

 

# print(object)

 

class Foo(object):

    pass

 

class Bar(Foo):

    pass

 

# print(Foo.__bases__)

print(Bar.__bases__)
示例

1.9 在多继承背景下的属性查找

#coding:utf-8

#在菱形继承的背景下,查找属性

#1、经典类:深度优先

#2、新式类:广度优先

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())
示例

 

1.10 super()依赖继承

#super()会严格按照mro列表从当前查找到的位置继续往后查找

class A:

    def test(self):

        print('A.test')

        super().f1()

class B:

    def f1(self):

        print('from B')

class C(A,B):

    pass

 

c=C()

print(C.mro()) #C->A->B->object

 

c.test()
示例

 

posted @ 2018-05-14 18:43  Jacob先生  阅读(105)  评论(0编辑  收藏  举报