1.继承 1.1继承概念 继承指的是类与类之间的关系,是一种什么“是”什么的关系,继承的功能之一就是用来解决代码重用问题。 继承是一种创建新类的方式,在Python中,新建的类可以
1.1继承概念
继承指的是类与类之间的关系,是一种什么“是”什么的关系,继承的功能之一就是用来解决代码重用问题。
继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类可以成为基类或超类,新建的类成为派生类或子类
1.2python中类的继承分类:单继承和多继承
class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 pass
1.3查看继承
"__base__只查看从左到右继承的第一个父类 __bases__查看所有继承的父类" #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: vita class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 pass print(SubClass1.__base__) print(SubClass2.__base__) print(SubClass1.__bases__) print(SubClass2.__bases__) E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py <class ‘__main__.ParentClass1‘> <class ‘__main__.ParentClass1‘> (<class ‘__main__.ParentClass1‘>,) (<class ‘__main__.ParentClass1‘>, <class ‘__main__.ParentClass2‘>) Process finished with exit code 0
1.4经典类与新式类
1.只有在Python2中才有新式类和经典类,Python3中全部都是新式类 2.在Python2中,如果没有显式的继承object类,那该类和其子类都是经典类 3.在Python2中,如果显式的继承object类,那该类和其子类都是新式类 4.在Python3中,无论是否继承object,都默认继承object,即Python3中所有类都是新式类 5.在Python3中,如果没有指定基类,会默认继承object类,object是所有Python类的基类 print(ParentClass1.__bases__) print(ParentClass2.__bases__) E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py (<class ‘object‘>,) (<class ‘object‘>,) Process finished with exit code 0
2.抽象与继承
抽象:抽取类似的部分,主要用于划分类别
继承:基于抽象的结果,通过编程语言去实现它,所以需要先对事物或逻辑进行抽象,之后通过继承的方式表达出抽象的结构
3.继承与重用
在开发中,如果类A与类B有很多相同的代码,就可以通过继承来实现,提高代码的重用性
可以让B继承A,B会‘遗传’A的所有属性(包含数据属性和函数属性)
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: vita class Hero: def __init__(self,nickname,aggressivity,life_value): self.nickname=nickname self.aggressivity=aggressivity self.life_value=life_value def attack(self,enemy): enemy.life_value-=self.aggressivity class Garen(Hero): pass class Riven(Hero): pass g1=Garen(‘草丛伦‘,100,300) r1=Riven(‘锐雯雯‘,57,200) print(g1.life_value) #结果:300 r1.attack(g1) print(g1.life_value) #结果:243 E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py 300 243 Process finished with exit code 0 "用已经有的类新建一个新的类,这样就可以重用已经有的软件中的部分代码,大大节省编程工作量,这就是软件重用,不仅可以重用自己的类,还可以继承别人写的类,也可继承标准库。"
4.属性查找与self深入理解
不管是类中的数据属性还是函数属性,都是先在自己的类中查找,没有,再到父类中查找
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: vita 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‘) b=Bar() b.f2() E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py Foo.f2 Bar.f1 Process finished with exit code 0