Python课程回顾(day21)
一、面向对象编程
基于我们之前学过的面向过程编程,我们的核心理念就定义在了过程二字,即先干什么再干什么的思想,基于这种思想我们可以将复杂的问题流程化进而简单化,但面向过程的缺点也是特别明显的,不仅可扩展性较低,在内部要更改某部分数据时极易引起牵一发而动全身的状况。
而面向对象与面向过程的基本理念都是为了让我们可以更快更简洁的去完成一个项目,而面向对象的核心二字就是对象,对象就是在我们现实生活中实时存在且拥有自己特征与能力的事物,可以是人,可以是物。而我们编程中面向对象的对象大致指的就是一种老板思想,即不需要你去思考某件事情具体要怎么做,只需要考虑将整个公司各个层级打理好即可,例如招聘要有人事部,开发要有技术部,资金要有财务部等多个公司内不可缺少的部门,换做我们的编程上就是不再去思考功能的具体实现,只需要将项目内需要的功能准备好即可,这种编程方式就叫做面向对象编程。
二、类与对象
在面向对象中我们需要掌握一个关键点,就是类与对象,对象我们已经知道了,那么什么是类呢?我们可以想到的是人类,种类,鸟类等等,其实最重要的就是我们是怎样将这些事物进行分类的呢?很明显的是他们都是有共同的特点的,既然对象是特征与技能的结合体,那类就是一系列拥有相似特征与能力的结合体!在我们的现实世界中,是先有对象,后来随着人的不断进步才将这些事物定义为某些种类,而在我们的python中则是先定义类,后产生对象的。
三、类与对象 /__init__函数
定义类的关键字为class + 驼峰体的类名,通常情况下类的体内包含的是对象的特征与对象的技能,使用变量来表示特征,函数来实现技能
class OldboyStudent: # 使用变量来记录特征 school = "Oldboy"
def __init__(self,name,age,gender): # 该函数只会在调用类时自动触发执行,将调用类时产生的对象名作为第一个参数传入
self.name = name
self.age = age # 为对象添加属性
self.gender = gender # 使用函数来表示技能 def learn(self): # 在类中的函数会自带一个位置形参,必须被传值 print('learning')
可以对类体内的特征进行增删改查
print(OldboyStudent.school) 查
OldboyStudent.school = 'xxx' 改
OldboyStudent.country = 'China' 增
del OldboyStudent.school 删
直接调用类会返回一个对象,然后执行__init__函数,将对象名作为第一个参数传入(OldboyStudent.__init__(self,name,age,gender))
stu1 = OldboyStudent('egon', '18', 'male') # 所以init函数的四个参数传入三个即可
stu2 = OldboyStudent('alex', '23', 'male') # 可以生产多个对象
四、类与对象的查找顺序
class Dog: name = 'egon' # 在类体内定义一个变量name
school = 'petschool' def __init__(self, name, age, color, gender): self.name = name self.age = age self.color = color self.gender = gender dog1 = Dog('kevin', 1, 'yellow', 'female') print(dog1.name) # 打印对象中的name print(Dog.name) # 打印类体内的name
print(dog1.school) # 打印对象内的school
输出结果:
kevin
egon 结论: 若对象中存有name则优先找对象内的,若没有则找类体内的
petschool
五、绑定方法
须知:类体内定义的所有内容(变量或者函数)都是给对象共享的,即所有对象都可以使用到类体内定义的东西,而不同的对象使用则会产生不同的结果,类体内定义的函数虽然类也可以调用,但通常情况下都是给对象使用的,而且是绑定给对象使用的,针对不同对象会产生不同的绑定方法
class OldboyStudent: school = "Oldboy" def __init__(self,name,age,gender): self.name = name self.age = age self.gender = gender def learn(self): print('learning') OldboyStudent.learn() # 函数内部定义的函数类也可以直接使用,但类使用函数时,函数就只是一个普通函数.所以函数若有参数就必须传参 stu1.learn() # 特殊之处:使用对象调用函数时,函数本身会将对象名作为第一个参数自动传入到函数内
六、一切皆对象
根据我们之前所学过的list,tuple,dict等等,其实我们在定义类的过程也可以说是在定义一个类型,操作方法都是一样的,都是在类里定义好各种函数,然后通过对象的调用来为对象增删改查相应的属性.例如list.append(),原理就是调用了list类体内的append函数来实现为列表内添加值的.所以在我们python3中,类与类型都是一样的
class Dog: name = 'egon' school = 'pet' def __init__(self, name, age, color, gender): self.name = name self.age = age self.color = color self.gender = gender dog1 = Dog('kevin', 1, 'yellow', 'female') print(type(dog1)) # 这里查看对象dog1的类型 输出结果: <class '__main__.Dog'> # 之前我们知道,dog1的类是Dog,现在dog1的类型也是Dog
# 结论:类与类型是一个概念(在python3中)
七、小练习
实现在一个对象内可以查看外部有多少个对象
class Foo: n = 0 def __init__(self): Foo.n+=1 强调:每个对象实例化类都会执行__init__函数,所以将对象个数设置为Foo共享的数量,每执行一次函数Foo体内的n都会加一次 所以每个对象访问n都会访问到Foo内共享的这个n obj1=Foo() obj2=Foo() obj3=Foo() print(obj1.n) print(obj2.n) print(obj3.n)
八、小练习2
class People: def __init__(self, name, agg, blood=300): self.name = name self.agg = agg self.blood = blood def bite(self,enemy): enemy.blood -= self.agg print('%s咬了一口%s,%s还剩余%s血量'%(self.name,enemy.name,enemy.name,enemy.blood)) p1 = People('egon', 60) class Dog: def __init__(self,name,agg,blood=300): self.name = name self.agg = agg self.blood = blood def bite(self,enemy): enemy.blood -= self.agg print('%s咬了一口%s,%s还剩余%s血量' % ( self.name, enemy.name, enemy.name, enemy.blood)) d1 = Dog('吉娃娃',50) p1.bite(d1) d1.bite(p1)