Python3 类的继承小练习
1、打印并解释结果
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
1 1 1
1 2 1
3 2 3
第一行: 子类会继承父类的属性
第二行: Child1.x = 2
给Child1
类添加了派生属性, 属性的搜索顺序是先子类后父类
第三行: Parent.x = 3
修改了父类的属性, Child2
继承了Parent
的x
属性, Child1
优先使用自身的x
属性
2、打印并解释结果(多重继承的执行顺序)
class A(object):
def __init__(self):
print('A')
super(A, self).__init__()
class B(object):
def __init__(self):
print('B')
super(B, self).__init__()
class C(A):
def __init__(self):
print('C')
super(C, self).__init__()
class D(A):
def __init__(self):
print('D')
super(D, self).__init__()
class E(B, C):
def __init__(self):
print('E')
super(E, self).__init__()
class F(C, B, D):
def __init__(self):
print('F')
super(F, self).__init__()
class G(D, B):
def __init__(self):
print('G')
super(G, self).__init__()
if __name__ == '__main__':
g = G()
f = F()
G
D
A
B
F
C
B
D
A
- 调用类会自动触发
__init__
函数 - 新式类的多重继承按从左到右, 广度优先的顺序搜索
3、什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?
- 新式类: 所有继承object的类及其子类都是新式类
- 经典类: Python2没有继承object的类及其子类都是经典类
- 深度优先: 当类经典类时, 多重继承时, 会按深度优先的方式查找
- 广度优先: 当类是新式类时, 多重继承时, 会按广度优先的方式查找
4、用面向对象的形式编写一个老师类, 老师有特征:编号、姓名、性别、年龄、等级、工资,老师类中有功能。
1.生成老师唯一编号的功能,可以用hashlib对当前时间加上老师的所有信息进行校验得到一个hash值来作为老师的编号
def create_id(self):
pass
2.获取老师所有信息
def tell_info(self):
pass
3.将老师对象序列化保存到文件里,文件名即老师的编号,提示功能如下
def save(self):
with open('老师的编号','wb') as f:
pickle.dump(self,f)
4.从文件夹中取出存储老师对象的文件,然后反序列化出老师对象,提示功能如下
def get_obj_by_id(self,id):
return pickle.load(open(id,'rb'))
5、按照定义老师的方式,再定义一个学生类
import hashlib
import time
import pickle
# 老师类
class PyTeacher:
def __init__(self, name, gender, age, level, salary):
self.name = name
self.gender = gender
self.age = age
self.level = level
self.salary = salary
self.id = self.creat_id()
def creat_id(self):
raw_id = str(time.time()) + self.name + self.gender + str(self.age) + str(self.level) + str(self.salary)
id = hashlib.md5(raw_id.encode()).hexdigest()
return id
def teach(self):
print('teaching Python...')
def tell_info(self):
print(f'ID:{teacher.id}, name:{teacher.name}, gender:{teacher.gender}, age:{teacher.age}, level:{teacher.level}, salary:{teacher.salary}')
def save(self):
with open(self.id, 'wb') as f:
pickle.dump(self, f)
print('done!')
def get_obj_by_id(self):
return pickle.load(open(self.id, 'rb'))
teacher = PyTeacher('龟叔', 'male', 18, 10, 0)
# 学生类
class PyStudent:
def __init__(self, name, gender, age, class_no, score):
self.name = name
self.gender = gender
self.age = age
self.class_no = class_no
self.score = score
self.id = self.creat_id()
def creat_id(self):
raw_id = str(time.time()) + self.name + self.gender + str(self.age) + str(self.class_no) + str(self.score)
id = hashlib.md5(raw_id.encode()).hexdigest()
return id
def learn(self):
print('learning Python...')
def tell_info(self):
print(f'''
ID:{self.id},
name:{self.name},
gender:{self.gender},
age:{self.age},
class:{self.class_no},
score:{self.score}
''')
def save(self):
with open(self.id, 'wb') as f:
pickle.dump(self, f)
print('done!')
def get_obj_by_id(self):
return pickle.load(open(self.id, 'rb'))
5、抽象老师类与学生类得到父类,用继承的方式减少代码冗余
class PyMan:
language = 'Python'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def save(self):
with open(self.id, 'wb') as f:
pickle.dump(self, f)
print('done!')
def get_obj_by_id(self):
return pickle.load(open(self.id, 'rb'))
# 老师类
class PyTeacher(PyMan):
def __init__(self, name, age, gender, level, salary):
super().__init__(self, name, age, gender)
self.level = level
self.salary = salary
self.id = self.creat_id()
def creat_id(self):
raw_id = str(time.time()) + self.name + self.gender + str(self.age) + str(self.level) + str(self.salary)
id = hashlib.md5(raw_id.encode()).hexdigest()
return id
def teach(self):
print('teaching Python...')
def tell_info(self):
print(f'''
ID:{teacher.id},
name:{teacher.name},
gender:{teacher.gender},
age:{teacher.age},
level:{teacher.level},
salary:{teacher.salary}
''')
# 学生类
class PyStudent(PyMan):
def __init__(self, name, age, gender, class_no, score):
super().__init__(self, name, age, gender)
self.class_no = class_no
self.score = score
self.id = self.creat_id()
def learn(self):
print('learning Python...')
def tell_info(self):
print(f'''
ID:{self.id},
name:{self.name},
gender:{self.gender},
age:{self.age},
class:{self.class_no},
score:{self.score}
''')
Python3 类的继承小练习的更多相关文章
- Python3 类的继承
目录 继承的基本概念 什么是继承 继承有什么用 如何实现继承 初识继承 寻找继承关系 如何寻找继承关系 实例演示 继承背景下的对象属性查找顺序 派生 新式类和经典类 钻石继承 通过继承实现修改json ...
- Python3 类和继承和组合
import random as r class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) ...
- python3 类的属性、方法、封装、继承及小实例
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- Python3 面向对象-类的继承与派生
1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可称为基类或超类,新建的类称为派生类和或子类. 子类会遗传父类的属性,从而解决代码重用问题. ...
- python3 入门 (四) 类与继承
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- Java类的继承与方法调用的一个小问题
public class Father { protected void server(int i){ switch (i){ case 1: methodone(); break; case 2: ...
- PYTHON3中 类的继承
继承 1:什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹. 新建的类成为子类或者派生类. 父类又可以成为基类或者 ...
- python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法
对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(sel ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
随机推荐
- Python基础教程(第3版)学习笔记
第1章.基础 1.几个小知识点 多用 help() 帮助文档 除法运算 / 除法运算,得到结果为浮点数: // 整除运算,得到整数值(向下取整): % 取余操作 (结果符号与除数符号相同),本质上: ...
- Cognitive Graph for Multi-Hop Reading Comprehension at Scale(ACL2019) 阅读笔记与源码解析
论文地址为:Cognitive Graph for Multi-Hop Reading Comprehension at Scale github地址:CogQA 背景 假设你手边有一个维基百科的搜索 ...
- web服务,ftp服务以及共享实现
在开始服务前一定要确保可以ping通外网,在虚拟机联网但ping 不通外网下 确认vim /etc/sysconfig/network-scripts/ifcfg-ens33 (nmcli conne ...
- 详解在Linux系统中安装JDK
本文以在CentOS 7.6中安装JDK8为例进行安装,其他系统和版本都是大同小异的. 下载 进入Oracle官方网站的下载页面. 首先,接受许可协议,如下图: 然后,根据Linux系统的位数选择要下 ...
- day29 文件的上传和下载 socketserver(并发)
文件上传的讲解: import subprocess res=subprocess.Popen("dir", shell=True, stderr=subprocess.PIPE, ...
- [书籍]值得纪念的第100篇博客,推荐一些看过的UI书籍
1. 前言 来到博客园11年,这两年闲下来了才有时间写写博客,不知不觉终于写到第100篇博客了.回顾过去发表的博客,居然大部分都与UI相关.明明我本来从事的是Oracle的相关开发,明明我当初的目标是 ...
- CCNA 之 九 STP生成树协议
STP生成树 在上一次实验中,使用了单臂路由是两个不同的VLAN之间进行通信,而单臂路由的这种网络拓扑,当一条链路或者路由设备出现故障的时候,整个网络就会瘫痪. 称此网络为:不健壮的,无冗余的网络环境 ...
- Vue.js 控制css样式
<script src="https://unpkg.com/vue/dist/vue.js"></script> <style type=" ...
- vue实例化过程
我们在用vue进行开发项目时,是否存在疑惑,new Vue(xxx)的过程中,究竟发生了什么?定义的数据,是如何绑定到视图上的?本篇主要介绍在实例化vue时,主要做了哪些事,文章比较长,主要篇幅内容为 ...
- io流函数略解(java)[一]
背景 最近在做安卓的过程中,因为im app经常涉及到读取与写入的io问题,所以总结一下.下文使用的是java语言. 实践 材料: java eclipse 1.File 在操作系统中我们一般能看到的 ...