五、面向对象(二)——继承与重写
“python基础系列”目录:
python中的几个概念。
- 模块:在Python中一个.py文件就可以称为一个模块,其表达的含义是实现了某个功能!我们在日常开发中说的某个模块其实也是表达的是实现某个功能的东西!
- 包:包是一个类似文件夹的东西,它里面包含了很多.py文件还有一个__init__.py文件,init.py这个文件是描述有多少个模块的东西。你可以将包理解为完成一系列的功能的一个东西,比如我们做网站的时候,最开始做的登录系统,你可以将登录、注册做成不同的模块,然后放在一个包里,因为他们有一些相关性,所以放在一个包里!
- 库:就是一个完整的东西,我们可以认为他是一个完整的项目打包,可直接调用或者运行,一个库中可能有多个包!库->包->模块,从大到小的层级关系!
导包
python中的两种导包方式:
1) import+模块名 常规导入,直接导入整个包的所有的功能函数。
import math
import os
import sys
# 以上可简写为:
import math,os,sys
2) from ... import ... 语句
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from pandas import Series
from pandas import DataFrame as df # 可以起别名
#以上可以简写
from pandas import Series,DataFrame as df
面向对象(二)
继承
- 在程序中,继承描述的是多个类之间的所属关系
- 如果一个类A里面的属性或方法可以复用,则可以通过继承的方式传递到类B里,那么类A就是基类,也叫做父类;类B就是派生类,也成子类
#父类
class A(object):
def __init__(self):
self.num = 10
def print_num(self):
print(self.num + 10)
#子类
class B(A):
pass
b= B()
print(b.num)
b.print_num()
单继承
概念:子类只继承一个父类
class Person(object):
def __init__(self):
self.name = "女娲"
def make_person(self):
print('{}制造了人类'.format(self.name))
class Teacher(Person):
# 子类可以继承父类所有的属性和方法,哪怕子类没有自己的属性和方法,也可以使用父类的属性和方法
pass
panda = Teacher() # 创建子类实例对象
print(panda.name) # 子类实例对象可以直接使用父类的属性
panda.make_person() # 子类实例对象可以直接使用父类的方法
多继承
概念:子类继承多个父类
class Women(object):
def __init__(self):
self.name = '女娲'
def make_person(self):
print('{}制造了人类'.format(self.name))
def move(self):
print("移动..")
class Man(object):
def __init__(self):
self.name = '亚当'
def make_a_person(self):
print('{}制造了一个人'.format(self.name))
def run(self):
print("跑..")
class Person(Women, Man):
pass
ls = Person()
print(ls.name)
ls.make_person()
ls.make_a_person()
总结:如果多个父类中有同名的属性和方法,则默认使用第一个父类的属性和方法,多个父类中不重名的属性和方法,不会有任何影响。
重写父类的方法
重写:子类继承父类,父类的方法不满足子类的需求,可以对父类的方法进行重写。
class Person(object):
def run(self):
print('跑起来了')
class Student(Person):
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
print("{age}岁的{name}跑起来了".format(age=self.age, name=self.name))
stu1 = Student('max',18)
stu1.run()
总结实战例子
# partents.py
#表示from 模块名 import * 只能使用指定的功能代码,而不是所有的功能代码,
__all__ = ['g_num','show','Teacher']
#定义一个全局变量
g_num = 10
#定义一个函数
def show():
print('我是一个函数')
#定义一个类
class Teacher(object):
#构造函数
def __init__(self,name,age):
self.name = name
self.age = age
def show_info(self):
print("大家好我是{}老师,今年{}岁".format(self.name,self.age))
#入口函数
if __name__ =='__main__':
Teacher('jack',40).show_info()
#child.py
from parents import *
show()
print(g_num)
stu = Teacher('jack',18).show_info()
# 子类不重写父类的构造方法,子类新增了自己的实例方法
class Student(Teacher):
#子类新增了自己的实例方法
def info(self,hobby):
print("student hobby is {}".format(hobby))
stu = Student('max','18')
# 子类调用自己的相关方法
stu.info('learning')
#子类调用父类中继承过来的方法:
stu.show_info()
#子类重写父类中的实例方法
class Student(Teacher):
#子类新增了自己的实例方法
def info(self,hobby):
print("student hobby is {}".format(hobby))
def show_info(self):
print("我重写了父类Teacher中的show_info方法")
stu = Student('leon','18')
#子类调用重写过的show_info方法:
stu.show_info()
# 子类重写父类的构造方法
class Student(Teacher):
def __init__(self,students_name,students_age):
self.students_name = students_name
self.students_age = students_age
#子类新增了自己的实例方法
def info(self,hobby):
print("student hobby is {}".format(hobby))
# 子类调用自己的相关方法
stu = Student('max','18')
print(stu.students_name)
stu.info('leaning')
#子类拥有自己的__init__() 方法,但是不覆盖父类的__init__(),此时需要使用super关键词:
class Student(Teacher):
def __init__(self,students_name,students_age):
super(Student,self).__init__(students_name,students_age)
self.students_name = students_name
self.students_age = students_age
#子类新增了自己的实例方法
def info(self,hobby):
print("student hobby is {}".format(hobby))
def intr_stu(self):
print("{students_age}岁的{students_name}介绍自己的爱好是玩".format(students_age=self.students_age,students_name=self.students_name))
def intr_teach(self,hobby):
print("{age}岁的{name}老师介绍自己的爱好是{hobby}".format(age=self.age,name=self.name,hobby=hobby))
# 子类调用自己实例属性对应的实例方法
stu = Student('max',18)
stu.intr_stu()
#子类自己的实例方法调用其父类所对应的实例属性
stu = Student('jack',30)
stu.intr_teach("看电影")