Python3 day6面向对象
http://www.cnblogs.com/alex3714/articles/5188179.html
====================生活中====================
世界万物,皆可分类
世界万物,皆为对象
只要是对象:肯定属于某种品类
只要是对象:肯定有属性
================================================
大纲:
面向对象:特性
核心:Class:类
Object:对象
特性:继承:Inheritance :便于程序的扩展,同时减少大量冗余代码
封装:Encapsulation:隐藏实现细节
多态性:polymorphism :一个接口多个实现,在继承、派生时候
继承特性

类的 封装
构造函数:向类的方法传值使用。
格式:def __init__(self,变量名1,变量名2,变量名3....):
self.内部变量名a = 变量名1
self.内部变量名b = 变量名2
self.内部变量名c = 变量名3
析构函数:双下划线开始和结束,在被实例化的实例被删除的时候自动执行:如本例的__del__()
私有类变量:当只有在类内部才可以被调用,定义格式为双下滑线开始:如本例:self.__life_value = life_value
私有方法:当只有在类内部才可以被调用,定义格式为双下滑线开始:如本例:def __selffunc(self):

类的重构:对父类构造函数重构用于:子类中需加入新的参数时使用【本例子类Man中比父类多了money实例变量】


继承多类


经典类和新式儿类的区别:主要体现在多类的继承
类的继承搜索方式(策略):
一:广度优先:Python3默认(不区分经典类和新式类)
二:深度优先:Python 2里面经典类使用的继承方式,新式类使用广度优先继承方式
本图:广度优先:当子类D实例化时,优先在B或者C找 构造函数__init__(self,变量名...)找不到再想上A那里找。

类的继承应用:学校,学校成员(教师、学生)
一个学校类
学校成员类
教师子类、学生子类
目标:学校类功能:学校名字、地址、招聘教师,收学生
成员类功能:都有名字、年龄、性别等成员共同属性。
教师子类:继承成员类功能,增加教学功能、工资、所教课程种类、
学生子类:继承成员类功能,增加学习功能、班级、所学课程种类、
实例化多个学生和老师,学校进行招聘,和开课。学校里面的信息更新,和查看。
class School(object):
'''学校共有属性'''
def __init__(self,name,addr):
self.name = name
self.addr = addr
self.students = []
self.staffs = []
def enroll(self,stu_obj):
print('为学员:%s 办理注册手续'% stu_obj.name)
self.students.append(stu_obj)
def hire(self,staff_obj):
print('hire teacher :%s'% staff_obj.name)
self.staffs.append(staff_obj)
class School_Member(object):
'''成员共有属性'''
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def tell(self):
pass
class Teacher(School_Member):
'''老师独有属性'''
def __init__(self,name,age,sex,salary,coures):
super(Teacher,self).__init__(name,age,sex)
self.salary = salary
self.coures = coures
def tell(self):
print("""
==========info Teacher:%s =========
name:%s
age:%d
sex:%s
salary:%d
coures:%s
"""%(self.name,self.name,self.age,self.sex,self.salary,self.coures))
class Student(School_Member):
'''学生独有属性'''
def __init__(self,name,age,sex,stu_id,grade):
super(Student,self).__init__(name,age,sex)
self.stu_id = stu_id
self.grade = grade
def tell(self):
print("""
==========info Student:%s =========
name:%s
age:%d
sex:%s
stu_id:%s
grade:%s
"""%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade))
t1 = Teacher('zhangmingda',22,'Man',15000,'python')
t2 = Teacher('zhangmingda2',23,'Man',18000,'Linux')
s1 = Student('qjj',24,'Girl',10001,'python')
s2 = Student('qjj2',25,'Girl',10002,'Linux')
school1 = School('隆化职中','下洼子')
school1.enroll(s1)
school1.enroll(s2)
school1.hire(t1)
school1.hire(t2)
school1.students[0].tell()
school1.students[1].tell()
school1.staffs[0].tell()
见代码
多态特性:一个接口多种实现
class Animal(object):
def __init__(self,name):
self.name = name
def talk(self):
'''如果直接用动物实例化一个名字,就断言为异常抛出,必须从动物子类实例一个动物'''
raise NotImplementedError("Subclass must implement abstract method") class Make_dog(Animal):
def talk(self):
print('%s talking: 汪汪汪.....'% self.name)
class Make_cat(Animal):
def talk(self):
print('%s talking: 喵喵喵.....' % self.name)
def please_talk(obj):
obj.talk()
d1 = Make_dog('李亮')
c1 = Make_cat('赵新新')
please_talk(d1)
please_talk(c1)
李亮 talking: 汪汪汪.....
赵新新 talking: 喵喵喵.....
在父类中实现一个接口多种实现(正常多态)
class Animal(object):
def __init__(self,name):
self.name = name
def talk(self):
'''如果直接用动物实例化一个名字,就断言为异常抛出,必须从动物子类实例一个动物'''
raise NotImplementedError("Subclass must implement abstract method")
@staticmethod
def animal_talk(obj):
'''在父类通过统一的接口,实现不同子类的统一功能调用,增强代码复用'''
obj.talk() class Make_dog(Animal):
def talk(self):
print('%s talking: 汪汪汪.....'% self.name)
class Make_cat(Animal):
def talk(self):
print('%s talking: 喵喵喵.....' % self.name) d1 = Make_dog('李亮')
c1 = Make_cat('赵新新')
Animal.animal_talk(d1)
Animal.animal_talk(c1)
李亮 talking: 汪汪汪.....
赵新新 talking: 喵喵喵.....
Python3 day6面向对象的更多相关文章
- [Python3] 024 面向对象 第四弹
目录 11. 类和对象的三种方法 12. 抽象类 12.1 抽象方法 12.2 抽象类 12.3 抽象类的使用 13. 自定义类 接上一篇 [Python3] 023 面向对象 第三弹 11. 类和对 ...
- [Python3] 023 面向对象 第三弹
目录 7. 类相关函数 8. 类的成员描述符(属性) 9. 类的内置属性 10. 类的常用魔术方法 10.1 操作类 10.2 描述符 10.3 属性操作 10.4 运算分类相关魔术方法 接上一篇 [ ...
- [Python3] 022 面向对象 第二弹
目录 6. 面向对象的三大特性 6.1 封装 6.1.1 私有 private 6.1.2 受保护 protected 6.1.3 公开 public 6.2 继承 6.2.1 继承的概念与作用 6. ...
- (转)Python之路,Day6 - 面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...
- Python3中面向对象 OOP
Python3中面向对象 OOP 定义: python中通过关键字 class 实现类的定义: class ClassName(object): pass 获取成员变量:ClassName.变量名 修 ...
- day6 - 面向对象学习
面向对象介绍 特性 class object 封装 继承 https://segmentfault.com/a/1190000002685939 python2 经典类是按照深度优先来继承的:新式类是 ...
- 【Python3之面向对象的程序设计】
一.面向对象的程序设计的由来 1.第一阶段:面向机器,1940年以前 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据. 简单来说,就是直接编写 0 和 1 ...
- python3之面向对象
1.面向对象术语 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类属性(类变量):类属性在整个实例化的对象中是公用的.类属 ...
- 转:Python之路,Day6 - 面向对象学习
这篇文章写的不错,转来收了 转自:http://www.cnblogs.com/alex3714/articles/5188179.html 本节内容: 面向对象编程介绍 为什么要用面向对象进 ...
随机推荐
- 关于uni-app导航栏中 中间大图标的设置
在uni-app的开发过程中,想要将位于中间的图标设置更大,通过一般的更改导航栏图标大小方式实现不了.经过查看官方文档可以发现,我们可以通过midbutton来设置中间tabbar的样式. 但前提是, ...
- 什么是CLI、GUI
就是命令行界面command-line interface,也有人称之为字符用户界面(CUI). 通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作. 因为,命令行界面的软件通常 ...
- 【贾志豪NOIP模拟题】慰问员工 cheer 【最小生成树】【对边权值的一些处理】
Description LongDD 变得非常懒, 他不想再继续维护供员工之间供通行的道路. 道路被用来连接 N(5 <= N <= 10,000)个房子, 房子被连续地编号为 1..N. ...
- FMT 和 子集卷积
FMT 和 子集卷积 FMT 给定数列 $ a_{0\dots 2^{k}-1} $ 求 $ b $ 满足 $ b_{s} = \sum_{i\in s} a_i $ 实现方法很简单, for( i ...
- liveBOS环境搭建
环境搭建:1.准备jdk1.6及以上版本oracle11gplsqlsql脚本(oracle_init.sql,oracle_insert.sql)livebos_tomcatlivebos的授权文件 ...
- matplotlib以对象方式绘制子图
matplotlib有两种绘图方式,一种是基于脚本的方式,另一种是面向对象的方式 面向脚本的方式类似于matlab,面向对象的方式使用起来更为简便 创建子图的方式也很简单 fig,ax = plt.s ...
- C# / VB.NET 在Word中嵌入多媒体(视频、音频)文件
Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...
- day13 cookie与session和中间件
day13 cookie与session和中间件 今日内容概要 cookie与session简介 django操作cookie与session django中间件简介 如何自定义中间件 csrf跨站请 ...
- 【leetcode】797. All Paths From Source to Target
Given a directed acyclic graph (DAG) of n nodes labeled from 0 to n - 1, find all possible paths fro ...
- Stream.toMap
Collectors类的tomap方法将流收集到映射实例中. list 转 map collection.stream().collect(Collectors.toMap(User::getId, ...