'''
# 1、什么是继承?
# 继承一种新建类的的方式,在python中支持一个儿子继承多个爹
# 新建的类称为子类或者派生类,
# 父类又可以称为基类或者超类
#
# 子类会”遗传“父类的属性
#
# 2、为什么要用继承
# 减少代码冗余
#
# 3、怎么用继承:
# '''
#
# 单继承与多继承(ps:再项目中我们一般最常用的是单继承):
# class ParentClass1:
# pass
#
# class ParentClass2:
# pass
#
# class SubClass1(ParentClass1): #单继承,括号内的类是基类,SubClass1是派生类。
# pass
#
# class SubClass2(ParentClass1,ParentClass2):
# pass
# 查看从左边起第一个基类
# print(SubClass2.__base__) #<class '__main__.ParentClass1'>
# 查看所有基类
# print(SubClass2.__bases__) #(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
# 如果没有指定基类则会默认继承object类,它是所有python类的基类。
'''
二、继承关系
继承是类与类之间的关系,寻找这种关系需要先抽象再继承
示例1中 把两个类中相同的部分单独建一个类(父类),创建子类时把父类导入。
'''
# 运用继承
# 示例1:
# class OidboyPepol:
#
# school='oldboy'
#
# def __init__(self,name,age,sex):
# self.name=name
# self.age=age
# self.sex=sex
#
# class Teacher(OidboyPepol):
# def change_score(self):
# print('teacher %s is changing score '%self.name)
#
# class Student(OidboyPepol):
# def choose(self):
# print('stydent %s choose course ' % self.name)
#
# tel=Teacher('egon',18,'male')
#
# stu1=Student('alex',73,'female')
# 基于继承看属性查找:
# 新式类严格遵循这一原则!!
# 查找顺序:自己名称空间—》 自己的类空间--》父类的名称空间—》object
# 示例:
# class Foo:
# def f1(self):
# print('Foo.f1')
# def f2(self):
# print('Foo.f2')
# self.f1()
# class Bar(Foo):
# def f1(self):
# print('Bar.f1')
# obj=Bar()
# obj.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() #儿子的f1
# 在子类派生出的新方法中重用父类的功能
#方式一:指名道姓地调用(其实与继承没有什么关系的)
# 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、经典类(只有在python2才区分经典类与新式类):
没有继承object的类,以及该类的子类,都是经典类
在菱形继承的背景下,查找属性
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())
# class OidboyPepol:
#
# school='oldboy'
#
# def __init__(self,name,age,sex):
# self.name=name
# self.age=age
# self.sex=sex
#
# class Teacher(OidboyPepol):
# def __init__(self,name,age,sex,level,salary):
#
# self.level=level
# self.salary=salary
# super().__init__(name,age,sex)
# def change_score(self):
# print('teacher %s is changing score '%self.name)
#
# class Student(OidboyPepol):
# def choose(self):
# print('stydent %s choose course ' % self.name)
#
# tel=Teacher('egon',18,'male',9,3.1)
# print(tel.name,tel.sex,tel.age,tel.level,tel.salary)
# stu1=Student('alex',73,'female')