Python 学习day20
博客整理 day 20
继承
什么是继承
继承指的是新建类的方法,新建的类称之为子类或者派生类
子类继承的类叫做父类,也称之为基类或超类
继承的特征:
子类可以继承父类的属性(特征与技能),并且可以派生出自己的属性(特征与技能)
attention : 在python中,一个子类可以继承多个父类,其他语言只能一个子类继承一个父类
为什么要继承
继承的目的是为了减少代码冗余(减少代码量)
如何实现继承
-
首先要确定好谁是子类,谁是父类
-
在定义类时,子类 + () ,()内写父类,实现继承
class 父: name = smile pass class 子(父): pass
#父类
class ParentClass1:
pass
class PaernrtClass2:
pass
#子类
class SubClass1(ParentClass1):
pass
class SubClass2(ParentClass1,ParentClass2):
pass
#查看继承的父类:__base__.是类的属性,用来查找当前类的父亲
print(SubClass1.__base__)
print(SubClass2.__base__)
寻找继承关系
如何寻找继承关系:
要想寻找继承关系,首先要'先抽象,在继承'
什么是抽象
抽象指的是抽取相似的部分,称之为抽象
继承的关系
对象是特征与技能的结合体
类是一系列对象相同的特征与技能的结合体
继承是一系列类相同的特种与技能的结合体
#不继承的情况下
#老师类
class OldboyTeacher:
school = 'oldboy'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def change_score(self):
print(.....)
#学生类
class OldboyStudent:
school = 'oldboy'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def choose_course(self.course):
print(.....)
#继承
#父类
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(.....)
class OldboyStudent(OldboyPeople):
def choose_course(self,course):
print(.....)
stu1 = OldboyStudent('smile',24,'male')
tea1 = OldboyTeacher('simple',25,'female')
对象属性查找顺序
在继承背景下,对象属性的查找顺序:
-
对象查找属性会先从对象的名称空间中查找
-
若对象没有,则会去类里找
-
若当前类是子类,并且没有对象找的属性,会去父类中查找
attention : 对象查找属性,若子类有,不管父类有没有,以子类的为准
#查看对象名称空间
print(tea1.__dict__)
#查看子类名称空间
print(tea1.__class__.__dict__)
#查看父类名称空间
print(tea1.__class__.__base__[0].__dict__)
派生
什么是派生
派生指的是继承父类的属性,并且派生出新的属性(*********)
子类派生出新的属性,若与父类的属性相同,则以子类的为准
继承是谁与谁的关系,指的是类与类的关系,子类与父类是从属关系
派生新的属性,并继承父类
方式一:
直接通过父类.(调用)__init__
,把__init__
当做普通函数使用,传入对象与继承的属性
class OldboyPeople:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level,salary):
OldboyPeople.__init__(self.name.age.sex)
self.level = level
self.salary = salary
方式二:
super是一个特殊的类,在子类中调用super()会得到一个特殊的对象,通过'.'指向的事父类的名称空间
class OldboyPeople:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level,salsary):
super().__init__(name,age,sex)
self.level = level
self.salary = salary
新式类与经典类
新式类:
继承object的类都称之为新式类
经典类:
在python2中,凡是没有继承object的类都是经典类
钻石继承
钻石继承也可以称之为菱形继承
在多继承的情况下形成的钻石继承(继承顺序)
经典类:
深度优先
新式类:
广度优先