day 24 二十四、组合、继承、方法重写和重用、super()
一、组合
1、定义:自定义类的对象作为类的属性
A类的对象具备某一个属性,该属性的值是B类的对象
基于这种方式就把A类与B类组合到一起
对象既能使用A类中的数据与功能,也能使用B类中的数据与功能
2、作用:组合与继承的作用一样,都是用来减少类与类之间的重复代码
class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age t1 = Teacher('Owen', 17)
print(t1.name, t1.age) # Owen 17
print(type(t1.name), type(t1.age)) # <class 'str'> <class 'int'> class Student:
# 学生可以有老师属性
def __init__(self, name, age, teacher):
self.name = name
self.age = age # 自定义类的对象作为类的属性
self.teacher = teacher stu = Student('Bob',18,t1 )
# print(stu.__dict__)
# {'name': 'Bob', 'age': 18, 'teacher': <__main__.Teacher object at 0x00000000021F7E10>} # 学生的年龄和姓名
print(stu.name, stu.age) # Bob 18
# 学生的老师年龄和姓名
print(stu.teacher.name, stu.teacher.age) # Owen 17
二、继承
1、定义:一种关系,子类可以通过父类获取属性和方法
继承是一种新建类的方式,新建的类称为子类或派生类
父类又称为基类、超类
作用:子类可以“遗传”父类的属性,从而可以减少代码冗余
如何寻找继承关系:先抽象,再继承,继承描述的就是 一种父子关系/从属关系
2、继承语法:
class Foo1:
pass class Bar(Foo1):
pass class Bar: # 在python3中没有继承任何类的类,默认继承object
pass
例: class People:
def __init__(self, name):
self.name = name def eat(self):
print(self.name + '在吃饭') class Student(People):
identify = '学生'
# def __init__(self, name):
# self.name = name # def eat(self):
# print(self.name + '在吃饭') student = Student('Bob')
student.eat() # Bob在吃饭 class Leader(People):
# def __init__(self, name):
# self.name = name
#
# def eat(self):
# print(self.name + '在吃饭')
pass leader = Leader('Yang')
leader.eat() # Yang在吃饭
3、继承关系(继承规则):继承是类与类之间的关系,寻找这种关系需要先抽象再继承
①父类的所有未封装的属性和方法,子类都能访问
②父类的所有封装的属性和方法,子类都不能访问
在外界通过子类或子类对象,不能访问
在子类内部也不能访问
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('teacher %s is changing score' % self.name) class Oldboystudent(OldboyPeople):
def choose(self):
print('student %s choose course' % self.name) tea1 = OldboyTeacher('egon', 18, 'male')
stu1 = Oldboystudent('alex', 73, 'female') print(tea1.name, tea1.age, tea1.sex) # egon 18 male
4、继承关系下的属性查找顺序:
①优先找自身,自身没有找父类
②父类没有找父类的父类
③一直找到最顶级的父类,如果还没有报错
5、抽离和派生
抽离:先有多个共有的类,抽出共性形成父类
派生:子类定义的名字会覆盖父类的同名属性
三、方法重写和重用
1、重写:先写好父类的方法,由于父类方法的功能不满足子类需求
子类可以重写父类方法:方法名与父类相同,自定义方法的实现体
2、重用:还需要父类方法的功能,在父类方法功能基础上再添加新功能
突破点:在子类中去调用父类的方法,还有保证调用者是子类(子类的对象)
# 1、方法的重写
class Sup:
num = 10
def test(self):
print('test sup') class Sub(Sup):
num = 100
# 先写好父类的方法,由于父类方法的功能不满足子类需求,
# 子类可以重写父类方法:方法名与父类相同,自定义方法的实现体
def test(self):
print('test sub') print(Sub.num) #
Sub().test() # test sub # 2、方法的重用
class Sup:
def test(self):
print('test sup') class Sub(Sup):
pass
# 重用:还需要父类方法的功能,在父类方法功能基础上再添加新功能
# 突破点:在子类中去调用父类的方法,还有保证调用者是子类(子类的对象)
def test(self):
# python2中写法:super(Sub, self).test()
# python3中简化写法
super().test()
print('test sub') Sub().test() # test sub
四、init结合super()
super关键字
super()可以得到调用父级功能的对象,调用者还是子类对象
super()只能在子类的方法中使用
uper()本质super(子类类名,当前对象)
# 人类:只需要初始化 - name
# 老师: 要初始化 - name salary
# 学生: 要初始化 - name grade class Sup:
def test(self):
print(self) def __init__(self, name):
self.name = name class Sub(Sup):
# 有继承关系下,只要名字相同,即使产生不同,还是属于同一个方法
def test(self, num):
super().test()
print(num) # 默认父级的__init__可以被继承过来,
# 但是会出现子类对象的属性比父类多 def __init__(self, name, salary):
super().__init__(name) # 父级有的共性功能通过super()交给父级做
self.salary = salary # 子类特有的自己来完成 # Sub().test(10)
# Sub().test() # 使用还是使用自身带参的,不能使用父级不带参的
# (本质名字相同就是一个,优先查找自己的)
五、多继承
1、简单的多继承
属性的查找顺序:优先找自己的,如果没有,按照继承先后查找父级
class A:
name = 'A'
num = 10 class B:
name = 'B'
count = 100 # 子类可以继承所有父类的所有可继承属性
class C(A, B): # 自己 => A => B pass print(C.num) #
print(C.count) #
print(C.name) # A
# 打印属性查找的顺序
print(C.mro())
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
2、复杂的多继承
class A:
name = "A"
class B(A):
name = "B"
class C:
name = "C"
class D(C):
name = "D"
class E(B, D):
name = "E"
print(E.mro())
# [<class '__main__.E'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.D'>, <class '__main__.C'>, <class 'object'>]
3、新式类与经典类
①新式类:继承object的类及其子类都是新式类
在python3中如果一类没有继承任何父类,那么默认继承object类,即在python3中所有的类都是新式类
②经典类:(只在python2中才有)没有继承object的类及其子类都是经典类
③二者的区分:在菱形继承下
经典类:深度优先查找
新式类:广度优先查找
class Foo(object):
pass class Bar(Foo):
pass print(Foo.__bases__) # (<class 'object'>,)
print(Bar.__bases__) # (<class '__main__.Foo'>,)
day 24 二十四、组合、继承、方法重写和重用、super()的更多相关文章
- python学习笔记(二十四)继承与封装
继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承. 实现继承的类称为子类,也叫派生类, ...
- Python笔记(二十四)_魔法方法_运算符的魔法方法
算数运算方法 .反运算方法 以对象A+对象B为例,都是将A作为self值,而B作为other值传入__add__(self,other)方法: 当用户输入A+B,就会调用重写的add方法: >& ...
- Struts(二十四):短路验证&重写实现转换验证失败时短路&非字段验证
短路验证: 若对一个字段使用多个验证器,默认情况下会执行所有的验证.若希望前面的验证器没有通过,后面的验证器就不再执行,可以使用短路验证. 1.如下拦截器,如果输入字符串,提交表单后,默认是会出现三个 ...
- 二十四. Python基础(24)--封装
二十四. Python基础(24)--封装 ● 知识结构 ● 类属性和__slots__属性 class Student(object): grade = 3 # 也可以写在__slots ...
- 使用Typescript重构axios(二十四)——防御XSRF攻击
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 设计模式学习(二十四):Spring 中使用到的设计模式
设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...
- WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...
- 3360: [Usaco2004 Jan]算二十四
3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6 Solved: 6[Submit][Statu ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
随机推荐
- linux内存 free命令 buffer cache作用
free命令用于查看linux内存使用情况 #free shared:用于进程之间相互共享数据. Used:已使用内存. total:内存总量. free:未使用的内存. available:开启一个 ...
- Sql server not in优化
使用EXISTS(或NOT EXISTS)通常将提高查询的效率,由于NOT IN子句将对子查询中的表执行了一个全表遍历. oracle在执行IN子查询过程中,先执行子查询结果放入临时表再进行主查询: ...
- Leetcode#88. Merge Sorted Array(合并两个有序数组)
题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- 函数的if--while流程控制
一.流程控制---if 1.if条件判断 age=18 hight=1.70 sex="female" is_beautiful=True if sex=="female ...
- JavaSE笔记-注释
Annotation Annotation是一个接口,可以把Annotation当成一个修饰符 Annotation的定义 注解通过@interface定义 public @interface Tes ...
- Codeforces 877E - Danil and a Part-time Job 线段树+dfs序
给一个有根树,1e5个节点,每个节点有权值0/.1,1e5操作:1.将一个点的子树上所有点权值取反2.查询一个点的子树的权值和 题解: 先深搜整颗树,用dfs序建立每个点对应的区间,等于把树拍扁成 ...
- 搬运,B站up主『凉风有性胖次君』日日日日日日日日日日在校园
这个视频超有毒,简直丧心病狂,我竟无言以对,凉风是有多大的耐性,搜集了这么多元素,哈哈哈~~~赶紧搬运,怕哪天B站都给封了 也就是说世界本来喜欢的是言叶,但是言叶爱上了一直在电车上暗恋她的诚哥,于是世 ...
- centos 搭建 leanote
centos 搭建leanote(蚂蚁笔记) 至于蚂蚁笔记是什么可以看官网的介绍,https://leanote.com/ ,我只能说 nice,你值得拥有. 开始搭建(源码安装,安装路径在 /et ...
- JVM·垃圾收集器与内存分配策略之垃圾回收算法!
1.垃圾回收算法 1.1.标记-清除算法(Mark-Sweep): 过程分为“标记”和“清除”两个过程.先将所有需要回收的目标统一标记,然后再统一清除. ...
- 无法执行该VI,必须使用LabVIEW完整版开发系统才可以解决该错误
该错误99%是因为你在某个vi中使用了外部系统组件,比如api,.net组件,ActiveX组件,com组件,所有不是Labview原生的接口,在你打包后,在其他没有安装这些组件的电脑上运行,就会出现 ...