Python学习计划(九)
面对对象(一)
一、面向对象思想
张老师吃饭,饭从哪里来?
(1)自己做
- 买菜
- 洗菜
- 切菜
- 做饭
(2)女朋友做 - 女朋友.买菜
- 女朋友.洗菜
- 女朋友.切菜
- 女朋友.做饭
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照指向的逻辑顺序组织在一起,数据与函数分开考虑。
面向过程:根据业务逻辑从上到下写代码。查询是执行者
面向对象:将数据与函数绑定到一起,进行封装,对外界提供调用。程序员是指挥者
面向对象的思维解决问题的重点:
(1)当遇到一个需求的时候不用自己取实现,如果自己一步步实现那就是面向过程
(2)应该找一个专门做这个事的人来做
(3)面向对象是基于面向过程的
二、类与对象
面向对象编程的两个非常重要的概念:类和对象
对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提供了另外一个新的概念—类
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象。
1、类
类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在,这个存在就是对象,一个类可以找到多个对象
2、对象
某一个具体事物的存在,在现实世界中可以是看得见摸得着的
可以是直接使用的
3、类与对象的关系:
类就是创建对象的模板
4、类的组成:
类的名称:类名
类的属性:一组数据
类的方法:允许操作的方法(行为)
5、类的抽取:
如何把日常生活中的十五抽象成抽象中的类?
拥有相同或者类似的属性和行为的对象都可以抽象出一个类
一般名词都是类
三、定义类
定义一个类,格式如下:
方法列表
四、创建对象
定义了一个car类,就好比车有一个图纸,那么接下来就应该把图hi交给生成工人们去生成了
pyhon中,可以根据已经定义的类去创建出一个个对象
创建对象的格式为:
例如:
BMW=Car0BMW.color = '黑色'
BMW.wheelNum = 4
BMW.move()
BMW.toot()
print(BMW.color)
print(BMW.wheelNum)
注意:
- BMW = Car(),这样就产生了一个Car的实例对象,此时也可以通过实例对象BMW来访问属性或者方法
- 第一次使用BMW.color = '黑色’表示给BMW这个对象添加属性,如果后面再次出现BMW.color = xxx表示对属性进行修改
- BMW是一个对象,它拥有属性(数据)和方法(函数)
五、init()函数
在上一小节的demo中,我们已经给BMW这个对象添加了2个属性,wheelNum(车的轮胎数量)以及color(车的颜色),试想如果再次给创建一个对象的话,肯定也需要进行添加属性,显然这样做很费事,那么有没有办法能够在创建对象的时候,就顺便把车这个对象的属性给设置呢?
通过_init_()函数为对象初始化属性值
#定义汽车类
class Car:def _init_(self):
self.wheelNum = 4
self.color = '蓝色'
def move(self):
print('车在跑,目标:夏威夷')
#创建对象
BMW = Car()print('车的颜色为:%s'%BMW.color)
print('车轮胎数量为:%d'%BMW.wheelNum)
当创建Car对象后,在没有调用_init_()方法的前提下,BMW就默认拥有了2个属性wheelNum和color,原因就是_init_()方法是在创建对象后,就立刻被默认调用了(为对象属性进行初始化赋值)。
这种对象的属性进行赋值的行为称之为默认初始化
这样子每个对象创建处理,属性值都一样,不能体现多样性,能不能再创建对象的同时对对象属性进行赋值呢?
self.wheelNum = newWheelNum
self.color = newColor
这种对象的属性进行赋值的行为称之为针对性初始化
- init(self)方法,在创建一个对象时默认调用,不需要手动调用
- init(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么_init_(self)中除了self作为一个形参外还需要2个形参
- init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去
六、str()函数
当我们通过print()函数将对象进行打印时,打印的是该对象的类型和地址。
如果想打印对象时,出来的是对象的一些属性值,怎么办呢?
msg = '嘿'
return msg
当使用print输出对象的时候,只要自己定义了_str_(self)方法,那么就会打印从在这个方法中return的数据
七、self关键字
所谓的self,可以理解为自己
可以把self当作C++中类里面的this指针一样理解,就是对象自身意思
某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可
八、面向对象的应用案例
烤土豆应用:
示例属性如下:
- cookedLevel:这是数字;0-3表示还是省的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了!我们的地瓜开始是生的
- cookedString:这是字符串;描述地瓜的生熟程度
- condiments:这是地瓜的配料列表,比如番茄酱、芥末酱等
示例方法如下: - cook():八地瓜烤一段时间
- addCondiments():给地瓜添加配料
- init():设置默认的属性
- str():让print的结果看起来更好一点
九、隐藏数据
如果有一个对象,当需要却对其进行修改属性时,有2中方法
- 对象名.属性名 = 数据 ----> 直接修改
- 对象名.方法名() ----> 间接修改
为了更好的保存属性安全,即不能随便修改,一般的处理方式为 - 将属性定义为私有属性
- 添加一个可以调用的方法,供调用
def _init_(self,name):
self._name = name
def getName(self):
return self._name
def setName(self,newName):
if len(newName) >= 5:
self._name = newName
else:
print('error:名字疮毒需要大于或者等于5')
xiaoming = people('HENG')
print(xiaoming._name)
python中没有像java中public和private这些关键字来区别公有熟悉和私有属性
它是以属性命名方式来区分,如果在属性名前面加了2个下划线,则表没该属性是私有属性,否则为公有属性。
十、del()函数
创建对象后,python解释器默认调用_init_()方法
当删除一个对象十,python解释器也会默认调用一个方法,这个方法为_del_()方法
- 当有1个变量保存了对象的引用时,此对象的引用技术就会加1
- 当使用del删除变量指向的对象时,如果对象的引用技术不是1,比如3,呢么此时只会让这个引用技术减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除
创作者:Eric· Charles