一.面向对象程序设计
1.面向过程程序设计:
侧重过程二字,即解决问题的步骤,先干什么,后干什么,应用场景比较固定
2.面向对象编程:
侧重对象二字,解决了程序的扩展性问题,对某一个对象的修改,会反应到整个体系中,比如在游戏中对一个人物特征和技能的修改,应用于需求经常变化的场景。
3.类与对象的概念
类:即类别种类,是一系列对象相似特征与技能的结合体
对象:特征与技能的结合体
现实中先有对象,然后才有类,在程序中需先定义类,然后才产生对象。
4.类的属性
两种属性:数据属性、函数属性
类的数据属性是所有对象共享的,类的函数属性是绑定给对象用的
类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数。
类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法
强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)
注意:python中一切皆为对象,且python3中类与类型是一个概念,类型就是类
二.面向对象的组合用法
1.组合:在一个类中以另外一个类的对象作为数据属性,称为类的组合、
class Weapon: # def prick(self, obj): # 这是该装备的主动技能,扎死对方 # obj.life_value -= 500 # 假设攻击力是500 # class Person: # 定义一个人类 # role = 'person' # 人的角色属性都是人 # def __init__(self, name,life_value): # self.name = name # 每一个角色都有自己的昵称; # self.life_value = life_value #生命值 # self.weapon = Weapon() # 给角色绑定一个武器; # alex = Person('alex',10000) # egon = Person('egon',5000) # egon.weapon.prick(alex) # print(alex.life_value) # egon.weapon.prick(alex) # print(alex.life_value)
组合例子:(圆环的面积和周长)
from math import pi class Circle: ''' 定义了一个圆形类; 提供计算面积(area)和周长(perimeter)的方法 ''' def __init__(self,radius): self.radius = radius def area(self): return pi * self.radius * self.radius def perimeter(self): return 2 * pi *self.radius circle = Circle(10) #实例化一个圆 area1 = circle.area() #计算圆面积 per1 = circle.perimeter() #计算圆周长 print(area1,per1) #打印圆面积和周长 class Ring: ''' 定义了一个圆环类 提供圆环的面积和周长的方法 ''' def __init__(self,radius_outside,radius_inside): self.outsid_circle = Circle(radius_outside) self.inside_circle = Circle(radius_inside) def area(self): return self.outsid_circle.area() - self.inside_circle.area() def perimeter(self): return self.outsid_circle.perimeter() + self.inside_circle.perimeter() ring = Ring(10,5) #实例化一个环形 print(ring.perimeter()) #计算环形的周长 print(ring.area()) #计算环形的面积
类的组合本质:在一个类中使用另一个类的属性和方法,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好