当前位置: 首页 > news >正文

python中类与对象之间的关系_面向对象进阶之类和类之间的关系

Python面向对象的特征

一、继承

在现实角度:分析阶段 对象------->抽象---------->出类

1122865-20170419163549806-1772693637.png

在程序的角度: OOP阶段 先写出父类-------->派生类继承父类------------>实例化出对象;正好与分析阶段相反;

1122865-20170419164123337-1846119672.png

得出结论:继承是抽象的结果;

现实角度:对象 ----->抽象 ----->类------> 抽象-------> 父类 ----->程序角度:————>定义父类----->派生类继承父类-------->实例化出对象

继承的作用:

1、解决代码的重用性

二、派生:新类可以派生出新的特征 和技能

class course: #课程类:老师类和学生类 都有课程 所以称为组合关系

def __init__(self,name,price,time):

self.name=name

self.price=price

self.time=timeclass Person: #人类:老师和学生类 的父类 ,他们之间的关系称为 继承

def __init__(self,name,age,course):

self.name=name

self.age=age

self.course=courseclass Teacher(Person): #老师类人类的派生类:派生了level 职业等级,也继承了父类 人类的 姓名,年龄,课程 属性

def __init__(self,name,age,course,level):

Person.__init__(self,name,age,course )

self.level=level#def __init__(self,name,age,course): #继承了父类 减少了代码

#self.name=name

#self.age=age

#self.course=course

class Students(): #学生类:派生了ID属性 学生ID,同时也继承了父类人类的 姓名,年龄,课程 属性

def __init__(self,name,age,course,id):

Person.__init__(self,name,age,course)

self.id=id

# self.name = name

#继承了父类 减少了代码

#self.age = age

#self.course=course

#self.age = age #self.course=course python_obj=course('python',15800,'7m') t=Teacher('egon',34,python_obj,'高级讲师') s=Students('张根',24,python_obj,8668)print('''%s正在学习%s课程 价格:%s 周期:%s 他的学生ID:%s %s正在教%s课程 价格:%s 周期:%s 他的教师职称:%s''' %(s.name,s.course.name,s.course.price,s.course.time,s.id,t.name,t.course.name,t.course.price,t.course.time,t.level))

三、组合:和继承一样 都是为了 解决代码重用性;

A类 B类 之间的关系为: 是 ----------》使用继承 例:梁山108条好汉都英雄

A类 B类 之间的关系为: 有 -------------》使用组合 例:梁山108条好汉都有自己的 武器

四:

1、接口和归一化设计===python中的抽象类

接口:把一些程序应该有的功能写到一个结合体里(父类),自己不实现,让其他子类去实现;

#_*_coding:utf-8_*_

__author__ = 'Linhaifeng'

#一切皆文件

import abc #利用abc模块实现抽象类

class All_file(metaclass=abc.ABCMeta):

all_type='file'@abc.abstractmethod#定义抽象方法,无需实现功能

defread(self):'子类必须定义读功能'

pass@abc.abstractmethod#定义抽象方法,无需实现功能

defwrite(self):'子类必须定义写功能'

pass

#class Txt(All_file):#pass#

#t1=Txt() #报错,子类没有定义抽象方法

class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法

defread(self):print('文本数据的读取方法')defwrite(self):print('文本数据的读取方法')class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法

defread(self):print('硬盘数据的读取方法')defwrite(self):print('硬盘数据的读取方法')class Process(All_file): #子类继承抽象类,但是必须定义read和write方法

defread(self):print('进程数据的读取方法')defwrite(self):print('进程数据的读取方法')

wenbenwenjian=Txt()

yingpanwenjian=Sata()

jinchengwenjian=Process()#这样大家都是被归一化了,也就是一切皆文件的思想

wenbenwenjian.read()

yingpanwenjian.write()

jinchengwenjian.read()print(wenbenwenjian.all_type)print(yingpanwenjian.all_type)print(jinchengwenjian.all_type)

2、作用:给继承自己的子类 规范功能,使不同子类的 调用方式统一;

不同的子类都 去实现父类定义的功能,这样不同子类实例化出来的对象 的调用方法就统一了;

五:多态和多态性:很多人喜欢将多态和多态性混为一谈,然后百思不得其解,其实只要分开看,就会很明朗;

1、多态:站在程序中类定义的角度: 指的是同一类事物的多种形态,(一个父类,一堆具有父类同性的子类继承他 就是多态的体现);

动物有多种形态:人,狗,猪

2、多态性:站在类实例化后,对象使用类的角度:人、猪、狗对象继承自一个动物类,他们继承了父类 相同的 走、说的方法;但是不同对象 调用相同的方法 就会有不同效果;

人对象调用走方法:人在走

狗对象调用走方法:狗在走

猪对象调用走方法:猪在走

classlinux_all:def __init__(self,name):

self.name=namedefread(self):print("正在 读取 %s 文件"%self.name)defwrite(self):print('正在 写入 %s 文件'%self.name)class txt(linux_all): #子类txt 继承了 父类Linux_all的方法: 读、写

def __init__(self,name):

super().__init__(name)

super().read

super().writeclass sata(linux_all): #子类SATA继承了 父类Linux_all的方法: 读、写

def __init__(self,name):

super().__init__(name)

super().read

super().writeclass Process(linux_all): #子类process继承了 父类Linux_all的方法: 读、写

def __init__(self,name):

super().__init__(name) #在程序定义角度:所有 子类 都继承了 父类相同的 方法

super().read #----------------------------------------------------------------------------------------------------

super().write

---------------------------------------------------------------------------------------------------------------------------------------

#程序调用角度:不同对象调用 继承自 父类相 同方法,执行结果却 不相同

正在 读取 文本 文件

正在 写入 文本 文件

正在 读取 磁盘 文件

正在 写入 磁盘 文件

正在 读取 进程 文件

正在 写入 进程 文件

相关文章:

  • 网关是什么意思_网关的理解
  • matlab toolbox下载_Mac上Matlab常见问题
  • python redis 操作_Python redis set集合操作
  • fileinputstream读取文件_20M 文件用 Java 压缩从30秒到1秒的优化过程
  • python打印皮卡丘_用python打印你的宠物小精灵吧
  • 平方根python_python的平方根
  • python怎么测试c代码_可以使用基于Python的单元测试框架和跑步者来测试C代码
  • nginx 跨域访问配置_nginx配置用户访问认证
  • python爬虫xpath教程_Spider-Python爬虫之XPath 教程
  • python常见报错类型_python打印错误类型
  • 华为官方解锁工具_开启“应用锁”和“健康使用手机密码”的华为,哪个功能对于用户隐私更安全?...
  • vant coupon 时间戳如何计算_flink入门(八)中的时间戳如何使用?Watermark使用及原理...
  • python按esc结束循环_當按ESC鍵時,立即讓python退出程序
  • python 元组和列表区别_Python高级数据类型之列表、元组
  • 微软商店账户登录一直转圈_Win 10再曝致命BUG,微软:暂不清楚问题根源
  • CAP理论的例子讲解
  • Cookie 在前端中的实践
  • egg(89)--egg之redis的发布和订阅
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • select2 取值 遍历 设置默认值
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 不上全站https的网站你们就等着被恶心死吧
  • 成为一名优秀的Developer的书单
  • 从伪并行的 Python 多线程说起
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 悄悄地说一个bug
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 三分钟教你同步 Visual Studio Code 设置
  • 项目实战-Api的解决方案
  • 新书推荐|Windows黑客编程技术详解
  • 一个JAVA程序员成长之路分享
  • 组复制官方翻译九、Group Replication Technical Details
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #{} 和 ${}区别
  • $GOPATH/go.mod exists but should not goland
  • (2)STM32单片机上位机
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (论文阅读40-45)图像描述1
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)甲方乙方——赵民谈找工作
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net mvc总结
  • .NET 事件模型教程(二)
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net反编译的九款神器
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • [ C++ ] STL---仿函数与priority_queue
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [BZOJ3757] 苹果树
  • [BZOJ5250][九省联考2018]秘密袭击(DP)