面向对象编程
面向对象编程
Oop变编程是利用类和对象来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为他可以使程序的维护和扩展变得更简单.
Class 类
一个类就是对一类相同属性的对象、蓝图、原型.简单来说就是模板
Object 对象
对象就是实体 人狗大战中的人和狗就是对象
通过赋值调用模板生成的实体,就是实例化
Inheritance继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
Encapsulation 封装
在类中对数据的而赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法.
面向过程编程
就是程序从上倒下一步步 执行,一步步从上到下,从头到尾的解决问题
面向过程的例子:有个需求是对网站的日志进行分析,生成邮件报告,分为以下步骤:
- 到各台服务器上收集日志,因为有许多台网站服务器,同时对外提供服务
- 对日志进行各种维度的分析,比如:pv,uv,来源地,访问的设备等
- 生成报告,发送邮件
面向对象vs面向过程总结
面向过程的优点:极大的降低了写程序的复杂度,只要顺着执行的步骤,堆叠德玛即可
缺点是:一套流水线或者流程就是用来解决一个问题,代码前一发动全身
面向对象的优点:解决了程序的扩展性,对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中的一个任务参数的特征和技能修改都很容易
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的也测问题的处理流程与结果
类的基本语法
class Dog: dog_type = "jingba" #属性,类属性,类变量 ,公共属性,所有狗都相同的属性 hp = "100" def __init__(self,name,age): # 初始化方法,构造方法 ,构造函数 实例化时会自自动执行,进行初始化工作 print('haha',name,age) #要想把name,age两个值,真正的存到实例里.就需要把两个值跟实例绑定 self.name = name self.age = age def sayhi(self): #方法,第一个参数必须是self , self代表实例本身 print("hello ,i am a dog ,my type is %s"%self.dog_type,self.name,self.age) d1 = Dog("xdd",2) # 生成了一个实例 d2 = Dog('jack',3) d1.sayhi() d2.sayhi() print(d1.dog_type)
Self 代表实例本身
属性引用 类属性属于共有属性 ,实例属性属于私有属性
类的公共属性引用 ==> 类名.属性
实例属性的引用 ==> d.name
类之间的依赖关系
# -*- coding:utf-8 -*- class Dog: def __init__(self,name,age,breed,master): self.name = name self.age = age self.breed = breed self.master = master def depends(self): print("hi ,i am %s, i am %s years old,my breed is %s my master is %s"%(self.name,self.age,self.breed,self.master)) class People: def __init__(self,name,age): self.name = name self.age = age def lugou(self,dog): print("i want liugou %s"%dog.name) p = People("jack",20) d = Dog("xdd",2,"jingba",p.name) d.depends()
对象之间的关联关系
# -*- coding:utf-8 -*- class Relationship: # 为了保存couple之间的情侣关系 def __init__(self): self.couple = [] def make_couple(self, obj1, obj2): self.couple = [obj1, obj2] print("%s and %s is couple" % (obj1.name, obj2.name)) def get_my_parter(self, obj): # print("find %s de couple"%obj.name) for i in self.couple: if i != obj: return i else: print("alone dog") def break_up(self): print("%s and %s break up"%(self.couple[0].name,self.couple[1].name)) self.couple = [] # 分手 class Person: def __init__(self, name, age, sex, relation): self.name = name self.age = age self.sex = sex self.relation = relation # self.parter = None # 应该是一个对象 def do(self): pass make_cp = Relationship() p1 = Person("xdd", 22, 'Man', make_cp) p2 = Person("dogs", 23, "Woamn", make_cp) make_cp.make_couple(p1, p2) #情感状态 # 双向关联,绑定 p1.parter = p2 p2.parter = p1 print(p1.parter.name, p2.parter.name)# 情侣名字 print(p1.relation.get_my_parter(p1).name) # p1的对象 p1.relation.break_up()# 分手 p2.relation.get_my_parter(p2)# 情感状态
对象间的组合关系
# -*- coding:utf-8 -*- # 组合关系由一堆组件构成一个完整的实体,组件本身独立,但又不能自己运行,必须跟宿主组合在一起运行 class Dog: hp = 100 def __init__(self,name,breed,attack_val): self.name = name self.breed = breed self.attack_val = attack_val def dog_bite(self,person): person.hp -= self.attack_val print("Dog [%s] bite person [%s] ,person hp - [%s],hp is [%s]"%(self.name,person.name,self.attack_val,person.hp)) class Weapon: #武器 def dog_stick(self,obj): self.name = "打狗棒" self.attackval = 30 obj.hp -= self.attackval self.print_log(obj) def print_log(self,obj): print("[%s] bei [%s] attack ,- hp [%s],hp is [%s]"%(obj.name,self.name,self.attackval,obj.hp)) class Person: hp = 100 def __init__(self,name,age): self.name = name self.age = age self.weapon = Weapon() #self.attack_val = attack_val # def person_beat(self,dog): # dog.hp -= self.attack_val # print("People [%s] beat Dog [%s], Dog - hp [%s],Dog hp is [%s]"%(self.name,dog.name,self.attack_val,dog.hp)) d = Dog("dogs","erha",30) p = Person("xdd",12) d.dog_bite(p) p.weapon.dog_stick(d)