继承+派生+分类+钻石继承(day20)
目录
昨日内容
面对对象编程
核心是'对象'',对象指的是特征和技能结合体
基于该编程思想编写程序,就好比在创造世界,一种上帝式的思维方式
优点:可扩展性高
缺点:编写程序的复杂性远高于面对思想
类
类是一系列对象相同的特征与技能的结合体
定义类时发生的事情
- 会产生一个空的名称空间
- 会把类内部的所有名字扔进名称空间中
- 会执行内部的代码
调用类时发生的事情
会产生一个空的对象
自动触发init
将对象和括号内的参数一并传给init
注意:调用类的过程称之为类的实例化,产生的对象称之为类的一个实例
init
在类内部创建的,会在调用类时触发该方法
对象
特征和技能的结合体
对象查找类的属性的顺序
- 对象的名称空间
- 类的名称空间
对象的绑定方法
- 由类调用类内部的函数,该函数只是一个普通的函数
- 有对象来调用类内部的函数,该函数就叫对象的绑定方法
- 对象的绑定方法,会将对象当作第一个参数传给该方法
python中万物皆对象
今日内容
继承
什么是继承
继承指的是新建类的方式
新建的类称之为子类/派生类,子类继承的类叫做父类/基类/超类
继承的特征
子类可以继承父类的属性,并且可以派生出自己的属性
注意:在python中,一个子类可以有多个父类,其他语言子类只有一个父类
为什么要继承
为了减少代码的冗余
如何实现继承
在定义类时,子类+(父类)实现继承
# 父类
class ParentClass1:
pass
class ParentClass2:
pass
# 子类
class SubClass1(ParentClass1):
pass
# 继承多个父类
class SubClass2(ParentClass1, ParentClass2):
pass
如何寻找继承关系
’‘先抽象再继承‘‘
先抽象
抽取相似的部分
[]
再继承
基于抽象的结果,通过编程语言去实现
继承的关系
对象是特征与技能的结合体
类是一系列对象相同的特征与技能的结合体
继承是一系列类相同的特征与技能的结合体
继承里对象属性的查找顺序
- 对象名称空间
- 子类
- 父类
- 报错
派生
派生指的是子类继承父类的属性,并且派生出新的属性
子类派生出新的属性,若与父类的属性相同, 则以子类的为准
继承是类与类的关系,子类和父类是从属关系
调用方式
父类调用
直接通过父类.
__init__
,把__init__
当作普通函数使用,传入对象和继承的属性class OldboyTeacher(OldboyPeople): # 等级, 薪资 def __init__(self, name, age, sex, level, sal): OldboyPeople.__init__(self, name, age, sex) self.level = level self.sal = sal class OldboyStudent(OldboyPeople): # 课程 def __init__(self, name, age, sex, course): OldboyPeople.__init__(self, name, age, sex) self.course = course def choose_course(self): print(f'学生{self.name}选择课程{self.course}')
super
super是一个特殊的类,在子类中调用super()会得到一个特殊的对象,通过'.'只想父类的名称空间
class OldboyTeacher(OldboyPeople): # 等级, 薪资 def __init__(self, name, age, sex, level, sal): super().__init__(name, age, sex) self.level = level self.sal = sal class OldboyStudent(OldboyPeople): # 课程 def __init__(self, name, age, sex, course): super().__init__(name, age, sex) self.course = course def choose_course(self): print(f'学生{self.name}选择课程{self.course}')
注意:两种方式不要混合使用
类的分类(了解)
mro(): 属于object(type)的函数,用来查看多继承情况下当前类的继承顺序
新式类
- 继承object的类以及其子类就叫新式类
- python3中所有的类默认继承object类,即所有类都是新式类
经典类
- 没有继承object的类以及其子类,就叫经典类
- 只有python2中才有经典类
钻石继承(菱形继承)(了解)
在多继承的情况下形成的钻石继承 (继承顺序)
经典类
深度优先
新式类
广度优先
## 继承修改json模块数据类型(拓展)
isinstance
python内置的函数,可以传两个参数,判断参数一是否式参数二的一个实例.
import json
from datetime import date, datetime
print(json.JSONEncoder)
print(datetime.today()) # 当前时间
print(date.today()) # 当前日期
class
MyJson(json.JSONEncoder):
def default(self, o):
# 子类派生的功能
# 判断o是否式datetime的一个实例
if isinstance(o, datetime):
return o.strftime('%Y-%m-%d %X')
elif isinstance(o, date):
return o.strftime('%Y-%m-%d')
else:
# 继承父类的default方法的功能
return super().default(self, o)
dict1 = {
'name': 'tank',
'today': datetime.today(),
'today2': date.today()
}
res = json.dumps(dict1, cls=MyJson) # cls=None,默认指向的是原json的JSONEncoder
print(res)
继承+派生+分类+钻石继承(day20)的更多相关文章
- Day 23 类的继承,派生,组合,菱形继承,多态与多态性
类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...
- C++:钻石继承与虚继承
QUESTION:什么是钻石继承? ANSWER:假设我们已经有了两个类Father1和Father2,他们都是类GrandFather的子类.现在又有一个新类Son,这个新类通过多继承机制对类Fat ...
- 深入super,看Python如何解决钻石继承难题 【转】
原文地址 http://www.cnblogs.com/testview/p/4651198.html 1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...
- 深入super,看Python如何解决钻石继承难题
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...
- C++_day8_ 多重继承、钻石继承和虚继承
1.继承的复习 1.1 类型转换 编译器认为访问范围缩小是安全的. 1.2 子类的构造与析构 子类中对基类构造函数初始化只能写在初始化表里,不能写在函数体中. 阻断继承. 1.3 子类的拷贝构造与拷贝 ...
- (转载)深入super,看Python如何解决钻石继承难题
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...
- python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)
先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...
- 4-13 object类,继承和派生( super) ,钻石继承方法
1,object 类 object class A: ''' 这是一个类 ''' pass a = A() print(A.__dict__) # 双下方法 魔术方法 创建一个空对象 调用init方法 ...
- C++//菱形继承 //俩个派生类继承同一个基类 //又有某个类同时继承俩个派生类 //成为 菱形继承 或者 钻石 继承//+解决
1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...
随机推荐
- asp.net core3.0 mvc 用 autofac
好久没有写文章了,最近在用.net core3.0,一些开发中问题顺便记录: 1.首先nuget引入 Autofac Autofac.Extensions.DependencyInjection 2. ...
- 快速入门和使用HTML–使用Django建立你的第一个网站
一 前记 你每天浏览的网页,通过网络看的新闻,看着淘宝京东的绚丽多彩的界面.是否想过这个问题,它是怎么实现的呢?有没有搜过相关的知识呢?假如没有,假如你是一位对事物好奇的主或者是做计算机相关东西的人. ...
- React + TypeScript 实现泛型组件
泛型类型 TypeScript 中,类型(interface, type)是可以声明成泛型的,这很常见. interface Props<T> { content: T; } 这表明 Pr ...
- 【Python笔记】Python 基础语法
Python 标识符 在 Python 里,标识符由字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. Python 中的标识符是区分大小 ...
- UploadFile
import org.apache.hadoop.conf.*; import org.apache.hadoop.fs.*; import java.io.IOException; import j ...
- opencv目标检测之canny算法
canny canny的目标有3个 低错误率 检测出的边缘都是真正的边缘 定位良好 边缘上的像素点与真正的边缘上的像素点距离应该最小 最小响应 边缘只能标识一次,噪声不应该标注为边缘 canny分几步 ...
- Spring 梳理 - filter、interceptor、aop实现与区别 -第一篇
前言 项目中我们经常需要对RESTful api进行拦截,主流实现方法有filter.interceptor.aop,先说一下他们各自的实现. Filter AnimalFilter实现javax.s ...
- Maven 梳理 -多模块 vs 继承
Maven提高篇系列之(一)——多模块 vs 继承 这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plu ...
- Ubuntu 搭建Zookeeper服务
1.下载安装包 官方下载地址http://apache.fayea.com/zookeeper/ 2.安装 安装前确保系统已安装过JDK,JDK安装过程可参照 2.1 解压下载好的tar.gz安装包到 ...
- .Net Core 商城微服务项目系列(七):使用消息队列(RabbitMQ)实现服务异步通信
RabbitMQ是什么,怎么使用我就不介绍了,大家可以到园子里搜一下教程.本篇的重点在于实现服务与服务之间的异步通信. 首先说一下为什么要使用消息队列来实现服务通信:1.提高接口并发能力. 2.保证 ...