Day16:面向对象
一、面向过程和面向对象
- 面向过程就好比精心设计一条流水线,一条解决某一问题的流水线,
需要周全考虑什么时候处理什么事情。
- 优点:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
- 缺点:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
- 面向对象就是把自己当做上帝,一切可看见的东西皆对象,对象就是拥有
某些属性和某些方法的东西。
- 优点:解决了程序的扩展性,对某一对象的修改,会立刻反映到整个体系中。
- 缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的
处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题。
二、初识类和对象
- 类就是具有相同属性和方法的一类事物。基本数据类型中的类型,
其本质就是类,也就是说在我们过去的学习中就一直在和类打交道了。
- 类的定义: class关键字 类名的首字母大写
- 对象的属性
- 一开始的时候通过init方法初始化来
- 在类内调用对象的属性:self.属性名
- 在类外调用对象的属性:对象名.属性名
- 调用方法的时候:
- 对象.方法名
- 不必传的参数:self
class Rectangle: #类名 def __init__(self,length,width): #静态属性 self.length = length self.width = width def perimeter(self): #动态属性/方法 return 2 * (self.length + self.width) def area(self): return self.length * self.width
三、类命名空间与对象、实例的命名空间。
- 创建一个类就会创建一个类的名称空间,
用来存储类中定义的所有名字,这些名字称为类的属性。
- 类有两种属性:静态属性和动态属性
- 静态属性就是直接在类中定义的变量
- 动态属性就是定义在类中的方法
- 其中类的数据属性是共享给所有对象的
- 而类的动态属性是绑定到所有对象的
- 创建一个对象(实例)就会创建一个对象(实例)的名称空间,
存放对象(实例)的名字,称为对象(实例)的属性
四、面向对象的组合用法。
- 组合就是在一个类中以另外一个类的对象作为数据属性。
class Person: def __init__(self,name,atk,blood): self.name = name self.atk = atk self.blood = blood def attack(self,dog): print('%s attacks %s' %(self.name,dog.name)) dog.blood -= self.atk print('%s residual HP:%d'%(dog.name,dog.blood)) def equip(self,weapon): #利用另外一个类的对象作为数据属性 print('%s equips %s'%(self.name,weapon.name)) self.atk = self.atk + weapon.atk self.blood = self.blood + weapon.blood class Dog: def __init__(self, name, atk, blood): self.name = name self.atk = atk self.blood = blood def bite(self, person): print('%s bites %s' %(self.name, person.name)) person.blood = person.blood - self.atk print('%s residual HP: %d'%(person.name,person.blood)) class Weapon: def __init__(self,name,atk,blood): self.name = name self.atk = atk self.blood = blood def hurt(self,dog): print('%s attacks %s' %(self.name,dog.name)) dog.blood -= self.atk print('%s residual HP:%d' % (dog.name, dog.blood)) person = Person('勇士',400,5000) dog = Dog('Huskie',300,20000) weapon = Weapon('打狗棒',1000,8000) person.equip(weapon) person.attack(dog)

浙公网安备 33010602011771号