哪有什么岁月静好,不过是有人替你负重前行!

继承与派生

一、继承

1.什么是继承?

  

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

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

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

子类会"遗产"父类的属性

 

2.为什么要使用继承

减少代码冗余

 

3怎么用继承

class ParentClass1:    #父类
        pass

class ParentClass2:      #父类
        pass

class Subclass1(ParentClass1):  #子类
    pass

class Subclass2(ParentClass1,ParentClass2):
    pass

print(Subclass1.__bases__)      #.__bases__# 类所有父类构成的元组(在讲继承时会讲)
print(Subclass2.__bases__)
View Code

 

 

二、寻找继承关系

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)

 

三、基于继承再看属性查找

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__)             #打印对象的特征字典=》{'name': 'egon', 'age': 18, 'sex': 'male'},对象/类名.__dict__# 类/对象的字典属性
# print(tea1.name)                #打印对象的名字属性=》egon
# print(tea1.school)              #=》oldboy
# print(tea1.change_score)            #累的一种绑定方法 =》<bound method OldboyTeacher.change_score of <__main__.OldboyTeacher object at 0x0000000001E7EF98>>
print(tea1.f1)                        #先从自己查找 ,自己没有到自己的类中进行查找,没有到父类中查找
                                      # <bound method OldboyPeople.f1 of <__main__.OldboyTeacher object at 0x00000000021CEF98>>

继承的属性查找

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

    def f2(self): #self=obj
        print('Foo.f2')
        self.f1() #obj.f1(),不会就近调用父类中的f1,而是调用子类中的f1

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

obj=Bar()      #调用的类没有传参
print(obj.__dict__)         #打印的是一个空字典
obj.f2()               #继承的属性查找=》Foo.f2》》Foo.f2

  

四、派生

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

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.change_score()                   #通过对象的名称空间中的名字name,指向类中的名称空间的名字change_score ,=>>teacher egon is changing score
tea1.f1()

 五、经典类与新式类

'''
1、新式类:
继承object的类,以及该类的子类,都是新式类

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

2、经典类(只有在python2才区分经典类与新式类):
没有继承object的类,以及该类的子类,都是经典类
'''
# print(object)

class Foo(object):
    pass

class Bar(Foo):
    pass

# print(Foo.__bases__)
print(Bar.__bases__)

  

 

posted @ 2018-04-12 14:36  迎风而来  阅读(203)  评论(0)    收藏  举报
/*吸附球*/