一切事物皆对象_基础篇
一 三大编程范式
编程范式即编程的方法论,标识一种编程风格
三大编程范式:
1.面向过程编程
2.函数式编程
3.面向对象编程
二 面向对象编程与面向对象设计
1.面向对象设计
面向对象设计(Object oriented design):将一类具体事物的数据和动作整合到一起,即面向对象设计
#相当于:类
def dog(name,gender,type):#狗的动作def jiao(dog):print('一条狗[%s],汪汪汪' % dog['name'])def chi_shi(dog):print('一条[%s] 正在吃肉' % dog['type'])#狗的属性def init(name,gender,type):dog1 = {'name':name,'gender':gender,'type':type,'jiao':jiao, #动作'chi_shi':chi_shi, #动作}return dog1return init(name,gender,type)d1=dog('元吴','母','中华犬')
d2=dog('alex','母','藏敖')
print(d1)
print(d2)
d1['jiao'](d1)
d2['chi_shi'](d2)
什么是类?
类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念。
什么是对象?
对象:就是基于类而创建的一个具体的事物(指具体存在的),也是特征和动作整合到一起。
2.面向对象编程
面向对象编程(object-oriented programming):用定义类+实例/对象的方式去实现面向对象的设计
#用面向对象编程独有的语法class去实现面向对象设计
class Dog:def __init__(self,name,gender,type): #实例化的过程,就是运行__init__self.name=nameself.gender=genderself.type=typedef bark(self):print('一条名字为[%s]的[%s],狂吠不止' %(self.name,self.type))def yao_ren(self):print('[%s]正在咬人' %(self.name))def chi_shi(self):print('[%s]正在吃屎' %(self.type))dog1=Dog('alex','female','京巴')
dog2=Dog('wupeiqi','female','腊肠')
dog3=Dog('yuanhao','female','藏獒')dog1.bark()
dog2.yao_ren()
dog3.chi_shi()
小结:
在Python中,类和 OOP 都不是日常编程所必需的。尽管它从一开始设计就是面向对象的,并且结构上支持 OOP,但 Python 没有限定或要求你在你的应用中写 OOP 的代码。
用面向对象语言写程序和一个程序的设计是面向对象的,两者就是两码事。
三 类和对象
1.什么叫类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例)。
2.什么叫对象:睁开眼,你看到的一切的事物都是一个个的对象,你可以把对象理解为一个具体的事物(事物即数据和动作的结合体)
(铅笔是对象,人是对象,房子是对象,狗是对象,alex是对象,配齐是对象,元昊是对象)
3.类与对象的关系:对象都是由类产生的,上帝造人,上帝首先有一个造人的模板,这个模板即人的类,然后上帝根据类的定义来生产一个个的人
4.什么叫实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例(实例=对象)
四 类的相关知识
1、初识类
在python中声明函数与声明类很相似。
声明函数
1
2
3
|
1 def functionName(args):
2 '函数文档字符串'
3 函数体
|
声明类
''' class 类名:'类的文档字符串'类体 '''#我们创建一个类 class Data:pass#用类Data实例化出一个对象d1 d1=Data()
经典类与新式类
大前提: 1.只有在python2中才分新式类和经典类,python3中统一都是新式类 2.新式类和经典类声明的最大不同在于,所有新式类必须继承至少一个父类 3.所有类甭管是否显式声明父类,都有一个默认继承object父类(讲继承时会讲,先记住) 在python2中的区分 经典类: class 类名:pass经典类: class 类名(父类):pass在python3中,上述两种定义方式全都是新式类
示例:
#经典类(python2.7) class Chinese:'这是一个中国人的类'passprint(Chinese)#新式类(python3.0)#实例化到底干了什么? p1=Chinese() #实例化 print(p1)
2、属性
类是用来描述一类事物,类的对象指的是这一类事物中的一个个体
是事物就要有属性,属性分为
1:数据属性:就是变量
2:函数属性:就是函数,在面向对象里通常称为方法
注意:类和对象均用点来访问自己的属性
类的属性
理论:数据属性即变量,类的定义与函数又极其类似,其实可以用函数的作用域来理解类的属性调用。
类的数据属性
#定义一个中文人的类,然后在类中定义一个类的属性,政府是共产堂,这样,只要是中文人他们的党永远都是共产堂 #类属性又称为静态变量,或者是静态数据。这些数据是与它们所属的类对象绑定的,不依赖于任何类实例。 #如果你是一位Java或C++程序员,这种类型的数据相当于在一个变量声明前加上static关键字。class Chinese:government='共产堂'print(Chinese.government)
类的函数属性(又称为方法)
class Chinese:government='共产_党'def sui_di_tu_tan():print('90%的中国人都喜欢随地吐痰')def cha_dui(self):print('一个中国人-->%s<--插到了前面' %self)Chinese.sui_di_tu_tan()person1_obj='alex' Chinese.cha_dui(person1_obj) #带参函数,所以调用时需要传入参数,将'alex'传给self
3、面向对象的三大属性
面向对象的三大特性是指:封装、继承和多态。
一、封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
所以,在使用面向对象的封装特性时,需要:
- 将内容封装到某处
- 从某处调用被封装的内容
self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1
当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2
所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。
第二步:从某处调用被封装的内容
调用被封装的内容时,有两种情况:
- 通过对象直接调用
- 通过self间接调用
1、通过对象直接调用被封装的内容
上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Foo:
def __init__( self , name, age):
self .name = name
self .age = age
obj1 = Foo( 'wupeiqi' , 18 )
print obj1.name # 直接调用obj1对象的name属性
print obj1.age # 直接调用obj1对象的age属性
obj2 = Foo( 'alex' , 73 )
print obj2.name # 直接调用obj2对象的name属性
print obj2.age # 直接调用obj2对象的age属性
|
2、通过self间接调用被封装的内容
执行类中的方法时,需要通过self间接调用被封装的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Foo:
def __init__( self , name, age):
self .name = name
self .age = age
def detail( self ):
print self .name
print self .age
obj1 = Foo( 'wupeiqi' , 18 )
obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18
obj2 = Foo( 'alex' , 73 )
obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78
|
综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。
二、继承
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
例如:
猫可以:喵喵叫、吃、喝、拉、撒
狗可以:汪汪叫、吃、喝、拉、撒
所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
那么问题又来了,多继承呢?
- 是否可以继承多个类
- 如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?
1、Python的类可以继承多个类,Java和C#中则只能继承一个类
2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先
- 当类是经典类时,多继承情况下,会按照深度优先方式查找
- 当类是新式类时,多继承情况下,会按照广度优先方式查找
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
此外,新式类和经典类还有其他区别。看下面这段代码
class person(object):def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexclass Teacher(person):def __init__(self,name,age,sex,salary,course):person.__init_(self,name,age,sex) #经典类super(Teacher,self).__init__(name,age,sex) #新式类
代码中Teacher类继承了person类,在构造函数中使用了两种继承的方式。
classical vs new style:
- 经典类:深度优先
- 新式类:广度优先
- super()用法
三、多态
多态是为实现接口的重用性,多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。python是不支持多态的,其实python也无需支持多态。因为python的语言类型,python可以使用“鸭子类型”来实现多态。我的理解就是定义新的函数,通过函数改变调用的方式。
class F1:passclass S1(F1):def show(self):print 'S1.show'class S2(F1):def show(self):print 'S2.show'# 由于在Java或C#中定义函数参数时,必须指定参数的类型 # 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类 # 而实际传入的参数是:S1对象和S2对象def Func(F1 obj):"""Func函数需要接收一个F1类型或者F1子类的类型"""print obj.show()s1_obj = S1() Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show s2_obj = S2() Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show Python伪代码实现Java或C#的多态
class F1:passclass S1(F1):def show(self):print 'S1.show'class S2(F1):def show(self):print 'S2.show'def Func(obj):print obj.show()s1_obj = S1() Func(s1_obj) s2_obj = S2() Func(s2_obj) Python “鸭子类型”
Python “鸭子类型”
4、总结
以上就是本节对于面向对象初级知识的介绍,总结如下:
- 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用
- 类 是一个模板,模板中包装了多个“函数”供使用
- 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
- 面向对象三大特性:封装、继承和多态
类和对象在内存中是如何保存?
类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:
如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类。
当通过 obj1 执行 【方法一】 时,过程如下:
- 根据当前对象中的 类对象指针 找到类中的方法
- 将对象 obj1 当作参数传给 方法的第一个参数 self
转载于:https://www.cnblogs.com/lixiaoliuer/p/6476058.html
一切事物皆对象_基础篇相关推荐
- Lunx运维监控_shark巨菜_基础篇
Lunx运维监控_shark巨菜_基础篇 一.监控重要性 单单从"监控"两个字来谈,范围之广可以涵盖我们生活的方方面面,我们生活和工作中处处可见视频监控的摄像机:机房中的电压电流监 ...
- Oracle、Mysql数据库编程开发基本操作命令语法脚本_基础篇(入门级)
Oracle.Mysql数据库开发基本操作命令语法脚本_基础篇(入门级) 文章目录 Oracle.Mysql数据库开发基本操作命令语法脚本_基础篇(入门级) 一.数据库中常用的字段类型 二.操作数据库 ...
- 东华大学2020考研计算机复试准备上机题解析答案_基础篇 前言
东华2020考研复试准备上机题解析答案_基础篇 前言 大家好,我是今年参加东华大学研究生入学考试的学生,前不久东华大学发布了关于复试上机的通知,还有题库供大家练习.我于是刷完了所有的题目,并且把题目和 ...
- c++ 线程池_基础篇:高并发一瞥,线程和线程池的总结
进程是执行程序的实体,拥有独属的进程空间(内存.磁盘等).而线程是进程的一个执行流程,一个进程可包含多个线程,共享该进程的所有资源:代码段,数据段(全局变量和静态变量),堆存储:但每个线程拥有自己的执 ...
- 第十二届_国赛蓝桥杯个人模板_基础篇
第十二届_国赛蓝桥杯个人模板_网格图_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_全排列_DFS/BFS篇 第十二届_国赛蓝桥杯个人模板_DP篇 第十二届_国赛蓝桥杯个人模板_数论篇 第十二届_国 ...
- Kotlin入门-万物皆对象,基础类型
Kotlin说:万物皆对象. 可以说,Kotlin全面的接管了所有类型.一统天下. 即是基础,那就需要,通盘了解.按目录来就行.也有Xmind版本 github地址 本文将从下面几个方面去讲解 数字 ...
- java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作
写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...
- python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象
第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...
- python进阶_基础篇4(数据类型和列表)
数据类型和列表 内容回顾(基础篇三) 1:if条件 应用场景: 1)if 单分支: 满足条件执行某个操作,不满足就不执行 2)if 双分支: 满足条件执行某个操作,不满足执行另一个操作 3)if 多分 ...
最新文章
- ASP.NET MVC之从控制器传递数据到视图四种方式(一)
- 安全无小事,责任大于天。
- Unity3D实践系列03,使用Visual Studio编写脚本与调试
- 邮政计算机网络,邮政计算机网络论文(共2018字).doc
- Qt文档阅读笔记-Object Model初步解析
- 菜鸟学习笔记:Java提升篇8(线程2——线程的基本信息、线程安全、死锁、生产者消费者模式、任务调度)
- opencv4版本和3版本_Spring Boot 太狠了,一口气发布了 3 个版本!
- 跑分cpu_跑分超过100万的CPU诞生
- android内存卡测试,安卓sd卡真假检测工具_内存卡检测扩容卡软件_sd insight
- window电脑通过composer安装yii2时总是失败
- 前端——列表、表格、表单
- [译] Architecture Components 之 Room Persistence Library
- 【愚公系列】2022年10月 微信小程序-电商项目-小微商户支付功能前申请准备工作
- 计算机网络原理ospf协议配置思考题,动态路由协议之OSPF理论篇(下)(含虚链路的实验)...
- FTX与加密监管:真金白银的理想消亡史
- 《C语言深度剖析》学习笔记----C语言中的符号
- 七千字的线性回归模型指南,建议收藏!
- YOLOv5系列(2)——YOLOv5导出jit,onnx,engine
- Nginx缓存问题导致的数据异常解决
- 分秒钟做款App:细数国内外在线DIY应用网站
热门文章
- 句柄与指针的区别(二)
- Python《爬取IPhone各式壁纸》
- 游戏cg提取工具_记蒼の彼方のフォーリズム の CG提取
- 主分区活动分区扩展分区逻辑分区
- php安装了openssl扩展,php如何安装openssl扩展?
- 使用pytorch查看中间层特征矩阵以及卷积核参数
- Java7并发编程指南——第八章:测试并发应用程序
- 交叉编译docker_端侧推理引擎Tengine初识:安卓平台交叉编译并跑通MobileNetV1
- python实训的意义_[Python] 一个让我更加清楚地理解了字典的实验……
- php token 表单重复提交,PHP生成token防止表单重复提交2个例子