面向对象初识
面向过程 VS 面向对象
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象的程序设计的
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
在python 中面向对象的程序设计并不是全部。
面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
了解一些名词:类、对象、实例、实例化
类:具有相同特征的一类事物(人、狗、老虎)
对象/实例:具体的某一个事物 (小明,小花)
实例化:类—到—>对象的过程
类
类:具有相同属性和方法的一类事物
对象:具有具体的属性的事物
def 函数名(): #定义函数
pass
class 类名:
pass
class Person: #定义类,首字母大写
role = 'person' #静态属性 类属性:所有的对象共有的属性,可以直接被类调用
def __init__(self,name,sex,aggressive=200):
#对象属性 属性 #是只属于某一个对象的,必须在实例化之后用对象调用
self.name = name #名字 self.name =‘alex’
self.sex = sex #性别
self.aggr = aggressive #攻击力
self.blood = 20000 #血
#self = {'name':name,'sex':sex,'aggr':aggr,'blood':blood,'attack':attack}
def attack(self): #类里面的所有方法本质上就是一个函数,拥有一个必须传的参数self
print('%s attack'%self.name)
print(Person.role) #查看类属性 person
print(Person.attack) #类方法 <function Person.attack at 0x000000000220AB70>
alex = Person('alex','male',250) #实例化一个对象
print(alex.name) #调用对象属性 alex
egon = Person('egon','female') #实例化一个对象
egon.attack() #调用对象方法 egon attack
小结
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass类名 类名.类属性 #查看类属性 类名.类方法 #但不能调用 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
对象之间的交互
示例
class Person: # 定义一个人类 role = 'person' # 人的角色属性都是人 def __init__(self, name, aggressivity, life_value): self.name = name # 每一个角色都有自己的昵称; self.aggressivity = aggressivity # 每一个角色都有自己的攻击力; self.life_value = life_value # 每一个角色都有自己的生命值; def attack(self,dog): # 人可以攻击狗,这里的狗也是一个对象。 # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降 dog.life_value -= self.aggressivity class Dog: # 定义一个狗类 role = 'dog' # 狗的角色属性都是狗 def __init__(self, name, breed, aggressivity, life_value): self.name = name # 每一只狗都有自己的昵称; self.breed = breed # 每一只狗都有自己的品种; self.aggressivity = aggressivity # 每一只狗都有自己的攻击力; self.life_value = life_value # 每一只狗都有自己的生命值; def bite(self,people): # 狗可以咬人,这里的狗也是一个对象。 # 狗咬人,那么人的生命值就会根据狗的攻击力而下降 people.life_value -= self.aggressivity egg = Person('egon',10,1000) #创造了一个实实在在的人egg ha2 = Dog('二愣子','哈士奇',10,1000) #创造了一只实实在在的狗ha2 print(ha2.life_value) #看看ha2的生命值 egg.attack(ha2) #egg打了ha2一下 print(ha2.life_value) #ha2掉了10点血 egon大战哈士奇
面向对象例子
from math import pi class Circle: def __init__(self,r): self.r = r def mianji(self): s2 = pi * (self.r)**2 print('面积%s'%s2) def zhouchang(self): z = pi * (2*(self.r)) print('周长%s'%z) c1 = Circle(3) #实例化一个圆 c1.mianji() c1.zhouchang()
# 练习一:在终端输出如下信息 # # 小明,10岁,男,上山去砍柴 # 小明,10岁,男,开车去东北 # 小明,10岁,男,最爱大保健 # 老李,90岁,男,上山去砍柴 # 老李,90岁,男,开车去东北 # 老李,90岁,男,最爱大保健 # 老张… class Zhou: def __init__(self,name,age,sex='男'): self.name = name self.age = age self.sex = sex def shangshan(self): print('%s,%s岁,%s,上山去砍柴'%(self.name,self.age,self.sex)) def kaiche(self): print('%s,%s岁,%s,开车去东北'%(self.name,self.age,self.sex)) def dabaojian(self): print('%s,%s岁,%s,最爱大保健' % (self.name, self.age, self.sex)) 小明 = Zhou('小明',10) 小明.shangshan() 小明.kaiche() 小明.dabaojian() 老李 = Zhou('老李',90) 老李.shangshan() 老李.kaiche() 老李.dabaojian()
既然选择了远方,便是风雨兼程...