python面向对象
- 1面向过程/面向对象
- 2面向对象核心概念-类
- 3类的设计
- 3.1类三要素-类名、属性、方法
- 3.2面向对象基础语法
- 3.2.1查看对象的常用方法
- 3.2.2类定义
- 3.2.3创建类对象
- 3.2.4__init__()方法
- 3.2.5 self参数
- 3.2.6类内置方法和属性
- _del_()方法--销毁对象
- _str_()方法--定制化输出对象
- 4面向对象的封装
- 4.1 身份运算符号 is、is not
- 4.2 私有属性和私有方法
本系列博文来自学习《Python基础视频教程》笔记整理,视屏教程连接地址:http://yun.itheima.com/course/273.html
1面向过程/面向对象
过程和函数:
过程是一个早期的编程概念,类似于函数,只能执行,没有返回值。
函数不仅能执行,还可以有返回值。
面向过程 和 面向对象:
面向过程:强调怎么做,把完成一个需求的步骤依次完成,根据开发需求,将独立功能封装成一个又一个的函数。
在开发复杂项目,没有固定的功能,开发难度大
面向对象:强调谁来做。根据职责在一个对象中封装更多的方法.
在完成一个需求时,首先确定职责,要明确该职责的对象,最后完成需求只要调用对应的对象就能完成该功能。
面向对象编程的例子–植物大战僵尸:
向日葵:产阳光,摇晃,生命值,主程序要做的就是把向日葵往地上一摆就行了(哈哈哈太搞笑了)
僵尸:啃植物,移动
2面向对象核心概念-类
类: 一群具有相同特征或者行为的事物的统称,是抽象的,不能直接使用。类的职责很单一就是为了创建对象用的。
特征被称为属性,
行为被称为方法。
(类:制造飞机使用的图纸,飞机具有什么特征,飞机有什么行为。)
对象:是由类创建的一个具体存在,可以直接使用。在程序开发时应该先有类。
(有了图纸,就可以造真的飞机。)
类和对象的关系:类只有一个,对象可以有很多个,不同对象之间的属性可能不同,(同一张图纸造出来的飞机可能颜色各不相同。)
类中的属性和方法对象中也会有,不会多也不会少。
3类的设计
3.1类三要素-类名、属性、方法
面向对象的开发之前,应该进行需求分析,确定一下,程序中要包含什么类。
设计类时要满足的三个要素
类名: 大驼峰命名,名词提炼法,
属性: 类别的特征
方法: 动词提炼法
例子:
小明今年18岁,身高175,今天早上去跑步,然后去吃饭
小美今年17岁,身高1.65,小美不跑步,小妹喜欢吃东西。
定义:人类:三个属性名字身高年龄,三个方法。
3.2面向对象基础语法
对象无处不在,变量,数据,函数都是对象。
3.2.1查看对象的常用方法
1.ipython中使用.+tab键来确定方法
2.dir(对象)查看的所有方法,带‘__’是内置方法和属性
3.__doc__可以查看函数文档
(ipython 中定义函数,两个回车之后结束定义)
3.2.2类定义
定义一个简单的类(在类中封装方法)
Class 类名:Def 方法名(self,参数列表):#第一个参数一定要是self,如果没有其他参数也要写一个self.
3.2.3创建类对象
接收对象的变量同样是对对象的引用,Tom接受猫类对象,为猫对象分配空间,让tom 指向这个对象
变量名=类名()
1.注:用print输出对象变量,会输出这个变量引用的对象 是由哪一个类创建的对象,以及在内存中的地址(以16进制的形式表示)
2.使用同一个类创建的不同的对象 指向的内存地址不同。就是说,引用不同,对象不同。
3.在类的外部给对象增加属性(这种方式很简单,但是不推荐使用)
对象.属性名=“属性值”
在类的外部给对象增加属性会造成的隐患:运行时找到属性可以正常执行,找不到属性就会报错。所以,类的属性应该封装在类定义中。
AttributeError: ‘Cat’ object has no attribute ‘name’
3.2.4__init__()方法
用类名+()创建对象时会做两件事:1.自动为对象分配内存空间;2.调用__init__()方法为对象的属性设置初始值(初始化方法)
对象的初始化方法__init__()专门用来定义类的属性。在初始化方法内部定义属性。在初始化方法__init__()中添加形参,在创建对象时,将属性作为实参传入。不同的对象就有不同的属性值。
self.属性名=属性值
3.2.5 self参数
self 保存着对象的引用。哪一个对象调用的方法,self 就是该对象的引用。利用self在 类封装的方法 中输出对象属性。self .属性名 来访问对象的属性。
对象内部属性和方法的调用都是用 self.属性 或者 self.方法 来实现。
3.2.6类内置方法和属性
一般不需要认为去编写,如果重写了该方法就能实现一些神奇的功能。
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,也叫做“魔法”方法。
del()方法–销毁对象
一个对象要被在内存中销毁,系统会自动调用对象的_del_()方法。生命周期:类名创建对象- del 方法调用结束
str()方法–定制化输出对象
print输出对象变量,默认情况下是输出变量 引用的对象 是由哪一个类创建的,以及在内存中的地址。但是,希望输出自定义的内容,就可以调用_str_()方法。
def __str__(self):#必须返回一个字符串return "我是小猫[%s]" % self.name
输出对象变量print(tom)时,就不是输出默认内容,而写在_str_方法中的内容。
当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
参考资料:https://www.runoob.com/note/41154
4面向对象的封装
封装是面向对象编程的一大特点,面向对象编程的第一步–将属性和方法封装到一个抽象的类中,外界使用类创建对象时,让对象 调用类的方法。所有方法的细节,都被封装在类内部。
小明爱跑步:体重75kg,跑步会减肥0.5Kg,吃东西会增重1kg.
class Person:def __init__(self,new_name,new_weight):self.name=new_nameself.weight=new_weightdef eat(self):self.weight+=1def run(self):self.weight-=0.5def __str__(self):return "%s 重 %.2f kg" % (self.name,self.weight)
xiaoming=Person("xiaoming",65)
#这里定义的类型决定了,该属性能够进行什么操作。
xiaoming.eat()
xiaoming.run()
print(xiaoming)
同一个类创建的不同对象的属性是互补干扰的。
一个对象的属性可以是另一个类创建的对象,被使用的类应该先开发。
4.1 身份运算符号 is、is not
身份运算符号 is、is not,比较两个对象的内存地址是否一致。
比较运算符==判断两个变量的值是否相等。
在Python中对None进行比较时建议使用is进行比较。
4.2 私有属性和私有方法
在实际应用中对象的某些属性或者方法只希望在对象的内部使用,而不希望外部访问。
私用属性: 对象不希望公开的属性
私有方法: 对象不希望公开的方法
定义方式:在定义属性或者方法时,在属性或者方法名下面 增加 两个下划线,定义的就是私有属性或者方法。实际是伪私有属性 和 伪私有方法,Python解释器会给加下划线的属性名和方法名做特殊处理,使用对应的属性名依旧可以访问。
_类名__属性名
在对象的方法内部,可以访问私有属性,但是在外界,不能访问私有属性(对象名.属性名)或者私有方法(对象名.方法名)