DAY 24继承与组合
一.继承
继承就是子类与父类形成的一种关系,可以让子类能直接从父类中获取属性与方法
优点:减少了类与类之间的代码冗余
语法:
class 父类: # 父类是多个有共同点的普通类抽离共有属性与方法形成的类
pass
class 类名(父类名):
pass
1.继承的信息
1.父类的所有未封装的属性和方法,子类都能访问
2.父类的所有封装的属性和方法,子类都不能访问
-- 在外界通过子类或子类对象,不能访问
-- 在子类内部也不能访问
2.有父类时的属性(方法)的查找顺序
class Sup:
num = 10
def test(self):
print('sup test')
class Sub(Sup):
num = 20
def test(self):
print('sub test')
print(num) # 20
print(Sub.test()) # sub test
1.优先找自身,自身没有找父类
2.父类没有找父类的父类
3.一直找到最顶级的父类,如果还没有则报错
3.方法的重写
继承与派生
先写子类,抽离 出父类
先写父类,派生 出子类
如果先写父类,由于父类的方法功能不能满足子类的需求
子类可以重写父类的方法:方法名与父类相同,自定义方法的实现体
class Sup:
def test(self):
print('sup test')
class Sub(Sup):
def test(self):
print('sub test')
4.方法的重用
重用:还需要使用父类的功能,在父类的方法功能基础上再添加新功能
突破点:在子类中调用父类的方法,还要保证调用者是子类(子类对象)
子类中利用super(子类,当前子类对象)可以调用父类的方法
python3中可以简写为super()
class Sup:
def test(self):
print('sup test')
class Sub(Sup):
def test(self):
super().test()
print('sub test')
Sub().test() # sup test sub test
5.__init__结合super()使用
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() # 使用还是使用自身带参的,不能使用父级不带参的
# (本质名字相同就是一个,优先查找自己的)
6.多继承
1.简单的多继承
# 属性的查找顺序:优先找自己的,如果没有,按照继承先后查找父级
class A:
name = 'A'
num = 10
class B:
name = 'B'
count = 100
# 子类可以继承所有父类的所有可继承属性
class C(A, B): # 自己 => A => B
name = 'C'
pass
print(C.num)
print(C.count)
print(C.name)
# 打印属性查找的顺序
print(C.mro())
# 经典类:python2中才有,没有继承任何类的类
# 新式类:python2中直接或间接继承object的类,python中所定义的所有类
class G: name = "G"
class C(G): pass
class B(C): pass
class E(G): pass
class D(E): name = "D"
class F(G): pass
class A(B, D, F): pass
print(A.mro()) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.G'>, <class 'object'>]
二.组合
# 自定义类的对象作为另外一个类的属性 class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age t1 = Teacher("Owen", 17)
print(type(t1.name), type(t1.age)) class Student:
# 学生可以有 老师 属性
def __init__(self, name, age, teacher):
self.name = name
self.age = age
# 自定义类的对象作为类的属性:组合
self.teacher = teacher
DAY 24继承与组合的更多相关文章
- Java中的继承与组合
本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...
- Python面向对象的三大特性之继承和组合
继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...
- 关于Java中的继承和组合的一个错误使用的例子
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
- [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类
目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...
- java 中继承,组合,重载,重写的实现原理 (转)
我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...
- <Java中的继承和组合之间的联系和区别>
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...
- Java中的继承与组合(转载)
本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...
- [Objective-c 基础 - 2.3] 继承、组合
A.继承的实现: is a 1.不允许子类.父类存在相同的成员变量 2.方法调用优先原则:子类调用方法的时候,优先从本类寻找,若无则向上在父类中寻找 3.重写:子类重新实现父类的方法,覆盖父类之前的方 ...
随机推荐
- 接口测试工具-poster
1.发包工具-火狐浏览器插件 安装:打开火狐浏览器-alt键-工具-附加组件-搜索poster-点击安装-重启火狐浏览器-打开工具下的poster 2.使用 1)GET 1.输入URL 2.填入参数 ...
- python类与对象-如何创建可管理的对象属性
如何创建可管理的对象属性 问题举例 在面向对象编程中, 我们把方法看作对象的接口, 直接访问对象的属性可能是不安全的,或设计上不够灵活. 但是使用调用方法在形式上不如访问属性简洁. circle.ge ...
- scanf函数的返回值
#include <stdio.h> int main() { ]; ]); printf("%d\n", n); ; } 此刻注意scanf函数里面的格式限定,该代码 ...
- 00004-20180324-20180517-fahrenheit_converter--华氏温度到摄氏温度转换计算器
00004-20180324-20180517-fahrenheit_converter--华氏温度到摄氏温度转换计算器 def fahrenheit_converter(C): fahrenheit ...
- 【SparkStreaming学习之三】 SparkStreaming和kafka整合
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- css3 box-flex
应用地址:http://www.jb51.net/css/467291.html box-flex是css3新添加的盒子模型属性,它的出现打破了我们经常使用的浮动布局,实现垂直等高.水平均分.按比例划 ...
- python源码为何都是pass
最近看Python代码 按照一个函数递进的看下去,最后发现,遇到很多源码什么逻辑都没写,仅仅以一个pass 结尾 但却能得到应该得到的结果,这点真的很奇怪,上网查找后 觉得下面的 ...
- LeetCode Weekly Contest 121
上周因为感冒没有刷题,两个星期没有刷题,没手感了,思维也没有那么活跃了,只刷了一道,下个星期努力. 984. String Without AAA or BBB Given two integers ...
- BZOJ 4195: [Noi2015]程序自动分析 并查集+离散化
LUOGU 1955BZOJ 4195 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量 ...
- ConcurrentHashMap源码理解
1.ConcurrentHashMap继承关系 ConcurrentHashMap继承了AbstractMap类,同时实现了ConcurrentMap接口. 2.ConcurrentHashMap构造 ...