二、封装
特点:单继承 多继承 多层次
特点:先实例化 父类 再实例化子类
现实:现有 爷爷 父亲 你
class B:
def __init__(self):
print("B的构造")
pass
class C(B):
def __init__(self):
print("A的构造")
pass
# 实例化子类
c=C( );
1.先实例化父类再实例化子类
2.Super关键字
特派员
生存:在子类 代表父类对象 A B:super C:super
语法:
构造: | super().__init(self) |
方法: | super().方法名() |
属性: | suuper().属性 |
3.题目
给父类加一个属性
父类有参数构造方法,子类必须定义一个有参数构造,给父类传递参数
完整代码:
class B:
def __init__(self,name):
print("B的构造")
self.name=name
pass
class C(B):
def __init__(self,name):
super().__init__(name)
print("A的构造")
pass
# 先实例化父类后实例化子类 输出:B构造 A构造
c=C("张三丰" );
print(c.name)
# B的构造
# A的构造
# 张三丰
简易代码: python帮助你赋值
子类可以不写构造方法,创建子类对象,默认调用父类构造方法
注意:
- 如果父类有,有参数构造 ,子类可以不写构造
- 如果父类有,有参数构造,子类的定义有参数构造必须调用父类有参数构造,进行赋值
- 如果父类是无参数构造(不写默认),子类有没有构造方法都可以
- 子类有没有构造 和 对父类没有关系
class B:
def __init__(self,name):
print("B的构造")
self.name=name
pass
class C(B):
pass
# 先实例化父类后实例化子类 输出:B构造 A构造
c=C("张三丰" );
print(c.name)
题目:
父类:Teacher
子类:htmlTeacher JavaTeacher
属性:名字 学校
方法:授课 自我介绍
from day0810.Teacher import *
class JavaTeacher(Teacher):
def giveLession(self):
print("打开eclipse")
super().giveLession()
class HtmlTeacher(Teacher):
def giveLession(self):
print("打开Dreamweaver")
super().giveLession()
java=JavaTeacher("张三","北京分校")
java.info()
java.giveLession()
html=HtmlTeacher("李四","山西分校")
html.info()
html.giveLession()
class Teacher:
def __init__(self, name, school):
self.name = name
self.school = school
def giveLession(self):
print("教学授课")
print("总结布置作业")
def info(self):
print("我是",self.school,"的",self.name)
练习;把HtmlTeacher中添加 编号属性, 输出:我的编号是:1001 我是北京分校的张三
多继承
class A:
def test1(self):
print("AAAAA")
class B:
def test1(self):
print("BBBBB")
class C(B,A):
pass
c=C()
c.test1()
print(C.__mro__)
# BBBBB
# (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
总结:
语法:class 子类(父类1,父类2)
方法名相同:先子类 父类1 父类2
方法名不同:子类全部继承