1.什么是继承?
在程序中,继承指的是class与class之间的关系
继承是一种关系,必须存在两个class才能产生这种关系;被继承的class称为父类,继承的class称为子类。
2.为什么要使用继承?
现实中,通过继承,子可以直接使用父的内容。
在程序中,通过继承,子类可以直接使用父类已有的代码
3.如何使用继承
#继承的定义 class Father1: x = 13 print('这是父类的x', x) def coding(self): print('我是父类的对象的绑定方法coding') @classmethod def missing(cls): print('这是父类的绑定方法missing') class Father2: y = 14 print('这是父类Father的y', y) class Son(Father1, Father2): pass print(Son.x) print(Son.y) son1 = Son() Son.coding(son1) Son.missing() son1.missing() ###输出结果 13 14 我是父类的对象的绑定方法coding 这是父类的绑定方法missing #1.命名方式: 在子类中类名加上括号,加上父类的名称即可 #2.在python中,一个子类可以有多个父类,多个父类在括号中用逗号隔开,这一点在其他语言中是不支持的。 #3.子类中的对象可以访问父类的属性和方法。 #4.子类可以调用父类的绑定方法
4.抽象
抽象:就是抽取公共的父类的方法
抽象的作用:抽取多个类中相同的方法和属性形成一个新的类
#应用如下: class Person: def __init__(self, name, age): self.name = name self.age = age def eating(self): print('%s要吃饭' % self.name) def sleeping(self): print('%s要睡觉' % self.name) class Child(Person): def crying(self, mom): print('%s今年%s岁会哭着找妈妈%s' % (self.name, self.age, mom.name)) class Adult(Person): def working(self, papa): print('%s会找老公%s' % (self.name, papa.name)) xiaoming = Child('xiaoming' , 2) mom = Adult('jessic', 28) papa = Adult('egon', 30) xiaoming.crying(mom) mom.working(papa) xiaoming.eating() xiaoming.sleeping() ###输出结果 xiaoming今年2岁会哭着找妈妈jessic jessic会找老公egon xiaoming要吃饭 xiaoming要睡觉 #总结: 1.通过继承,避免了重复代码的书写 2.通过抽象,避免了继承一些不该有的方法和属性 3.写继承时应该先抽象再继承 4.在抽取过程中,可能会有一些跟业务需求无关的类这是正常的,这些称为公共父类。 5.公共父类的作用是储存多个子类相同的属性和方法
5.派生
派生指的是子类继承父类,并且拥有自己独特的属性或技能,该子类称为派生。派生类一定是子类。
#为什么有派生类? #因为子类可能有自己独特的属性需要添加 class Person: def __init__(self, name, age): self.name = name self.age = age def say_hi(self): print("hello my name is %s,i'm %s years old" % (self.name, self.age)) class Student(Person): def __init__(self, name, age, adress): self.name = name self.age = age self.adress = adress def attend_class(self): print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age)) daidai = Student('daidai', 26, 'china') daidai.say_hi() daidai.attend_class() hello my name is daidai,i'm 26 years old daidai家在china,26岁,要好好学习 #Student就是一个派生类
6.子类访问父类的方法和属性
在派生中,相同的初始化属性,相同部分写了重复代码
有两种方式可以让子类访问父类的方法和属性
class Student(Person): def __init__(self, name, age, adress): #第一种调用方式:在子类中重用父类方法。这种调用方式与继承关系无关 Person.__init__(self, name, age) self.adress = adress def attend_class(self): print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age)) daidai = Student('daidai', 26, 'china') daidai.say_hi() daidai.attend_class() ###2. class Student(Person): def __init__(self, name, age, adress): #第二种调用方式:利用super() #super()表示创建一个特殊对象,可用于调用父类 super().__init__(name,age) # Person.__init__(self, name, age) self.adress = adress def attend_class(self): print('%s家在%s,%s岁,要好好学习' % (self.name, self.adress, self.age)) daidai = Student('daidai', 26, 'china') daidai.say_hi() daidai.attend_class() ##了解 在python2中,super()的使用方法有所不同,需要写成: super(Student, self).__init__(name, age) #其中Student表示父类,self表示是对象本身
7.继承后子类的属性查找
class S: x = 1 class A(S): x = 2 class B(A): x = 3 b = B() b.x = 4 print(b.x) 子类对象和对象的查找方法的查找顺序: 对象——>B(子类)——>A(父类)——>S(父类) #如果一个子类有多个父类时查找顺序 #1.如果父类不存在自己的父类时,按照继承的顺序去查找BASC #2.如果父类还有自己的父类时,则按照继承顺序沿一条线找到底(深度查找) #3.如果存在两层关系还有公共关系时,会按照广度优先原则查找,也就是最后一层不会先找,先按照深度原则找完父类,然后再找父类的公共类 class C: x = 5 class S: x = 1 class A: x = 2 class B(A, S, C): x = 3 b = B() b.x = 4 print(b.x) #注意: 1.在经典类中,属性的查找只按照深度查找原则 2.只有在python2中才有经典类
8.经典类和新式类
所有直接继承或者间接继承object的类,都是新式类,object称之为根类,意思时所有类都是源自object类
-
为什么这么设计?
创建对象时,需要申请内存空间,创建新的名称空间,将对象的属性放入名称空间,这一复杂的基础操作都是由object完成的。简单来说就是object提供了一些常用的基础操作
注意:
1.在python3中,所有类都是object的子类,所有类都是新式类
2.在python2中,默认的是经典类,不会继承object
#区别 #python3中定义类 class Cls(): print('python3中定义类') #python2中 class Cls(Object): print('python2中定义类')
-
class Cls(): print('python3中定义类') Cls.__base__ #Cls.__base__用于查看父类 Cls.mor() .mor()显示属性列表